golang语言 map
map是引用类型,底层是哈希表,操作是常数时间的
复制map,新旧map共享同一个底层哈希表,在函数里对map进行操作,结果对调用者可见
var m map[int]string,m是nil,底层没有引用哈希表,
不能向nil值的map添加元素,其他大部分对nil值的map的操作都是合法的,行为类似于空map,如查找、删除、len、range等
map不能比较,唯一合法的比较操作是和nil比较
map会重新分配内存空间,所以 &m["abc"] 是非法的
key必须支持 == 和 != 操作,因此key不能是function、map、slice,key如果是接口类型,那么该接口类型的动态值必须支持 == 和 != 操作
make()可创建空map并指定初始容量,初始容量不会限制map的大小,
map[*T]struct{ x, y float64 }
map[string]interface{}
make(map[string]int)
make(map[string]int, 100)
ages := map[string]int{
"alice": 31,
"charlie": 34,
}
这相当于
ages := make(map[string]int)
ages["alice"] = 31
ages["charlie"] = 34
map[string]int{} // 已初始化,空map
new(map[string]int) // 未初始化,nil值
map[string]int(nil) // 未初始化,nil值
delete( m, "abc" )
delete一个nil值的map,或delete的key不存在,相当于做了一个空操作
for k, v := range m 遍历顺序是随机的
v := m["abc"] // abc不存在时,v为对应类型的零值
if v, ok := m["abc"] ; !ok {...} // ok表明是否存在
map的元素是结构体或数组,不能被部分修改,元素是切片或map,可以部分修改
推测元素是引用类型,则可以部分修改
a := map[int]Point{1:{3,4}} // 元素为结构体
x := a[1].x // 3 可以读取
a[1].x = 7 // 错误 不能修改
a := map[int][5]int{1:[5]int{3,4}} // 元素为数组
a[1][1] = 123 // 错误 不能修改
a := map[int][]int{1:[]int{3,4}} // 元素为切片
a[1][1] = 123 // 可以修改
a := map[int]map[int]int{1:map[int]int{3:3}} // 元素为map
a[1][4] = 4 // 可以修改