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 // 可以修改

 

posted @ 2020-05-27 21:07  是的哟  阅读(236)  评论(0编辑  收藏  举报