Go Map

map

map使用散列表(hash)实现

添加关联到map并访问关联和数据

map[Key_Type]Value_Type

scene := make(map[string]int)
scene["route"] = 66
fmt.Println(scene["route"])
v :=scene["route2"]    //尝试查找一个不存在的键,返回的将是value_type的默认值
fmt.Println(v)

/**
66
0
*/

填充内容方式

m := map[string]string{
    "W": "forward",
    "A": "left",
    "D": "right"
}

并没有使用make,而是使用大括号进行内容定义,就像json格式一样,健值对,并使用逗号分割。

取值

m = map[string]int{}
i := m["route"]

如果route存在,就返回那个值,如果不存在,返回0值,也就是说,根据这个value的类型,返回缺省值,比如string,就返回“”,int 就返回0

判断map中key是否存在

if _, ok := map[key]; ok {
//存在
}
    m := make(map[string]string)
	m["b"] = "1"
	val,exist := m["a"]
	val1,exist1 := m["b"]
	fmt.Println(val,exist)
	fmt.Println(val1,exist1)
//	 false
//    1 true

delete()从map中删除健值对

delete(map, 键)
//map 要删除的实例

清空map中的所有元素

清空map的唯一办法就是重新make一个新的map。
不用担心垃圾回收的效率,Go中的并行垃圾回收效率比写一个清空函数高效的多。

能够在并发环境中使用的map——sync.Map

Go中的map在并发环境下,只读是线程安全的,同时读写线程不安全。

package main

func main() {
	m := make(map[int]int)
	// 并发情况下读写 map 时
	go func(){
		// 不停地对map进行写入
		for {
			m[1] = 1
		}
	}()

	go func(){
		// 不停地对map进行读取
		for {
			_ = m[1]
		}
	}()

	// 无限循环, 让并发程序在后台执行
	for {
		_:
	}
}

出现错误: fatal error: concurrent map read and map write

使用sync.map (对key加锁)

package main

import (
	"fmt"
	"sync"
)

func main() {
	m := sync.Map{}
	// 并发情况下读写 map 时
	go func(){
		// 不停地对map进行写入
		for {
			m.Store(1,1)
		}
	}()

	go func(){
		// 不停地对map进行读取
		for {
			_,err := m.Load(1)
			fmt.Println(err)
		}
	}()

	// 无限循环, 让并发程序在后台执行
	for {
		_:
	}
}
原文地址:https://www.cnblogs.com/followyou/p/12355313.html