【概念】
1- map 是引用类型的
2- 声明方式
var map1 map[keytype]valuetype
例如:var map1 map[string]int
3- map是可以动态自增长的
4- 未初始化的map的值是nil
5- 可以是任意用==或者!=操作符比较的类型,比如string,int,float。不常用的还有指针和接口类型也可以。切片和结构体不行(如果要用结构体做key,需要做变通,使用提供Key(),Hash()方法)
6- value可以是任意值
7- map传递给函数的代价很小,在32位机器上占4个字节,在64位机器上占用8个字节,无论实际存储了多少数据。
备注:在map中查找比线性查找快,但是比数组和切片的索引中直接读取要慢100倍,在乎性能请使用切片或数组
8- 不要使用new来构造map,永远使用make来构造map
备注:若使用了new()分配了一个引用对象,你会获得一个空引用的指针,相当于声明了一个未初始化的变量并且取得了它的地址
【map容量】
map的长度是动态的,它不存在固定长度和限制最大长度,但是我们也可以标明map的初始容量:make(map[int]string, cap),出于性能考虑还是应该在大容量和快速扩张的map中标明初始化容量
【map的常用操作】
1- 测试键值对是否存在
备注:map[key] 有两个返回值,第一个是该map键对应的值,第二个返回值是True(该键对应有值)或False(该键对应没有值)
1 _,ok := map[key] 2 if _,ok := map[key];ok{ 3 // do something 4 } 5 package main 6 func main(){ 7 mf := make(map[int]string,2) 8 mf[1] = "hello" 9 mf[2] = "world" 10 11 // 测试键值是否存在 12 if _,ok := mf[1];ok{ 13 fmt.Printtf("key %d exists") 14 }else{ 15 fmt.Printf("key %d unexists") 16 } 17 18 // 删除键值 19 delete(mf,1) 20 }
2- 删除键值对
delete(mf, 1)
【map的for-range输出值】
map既不是按照key的顺序排列的,也不是按照value的值排列的,每次输出都是随机
1 package main 2 3 import "fmt" 4 5 func main(){ 6 mf := map[int]string{1:"hello",2:"world"} 7 for key := range mf{ 8 // 每次运行输出的顺序都不同 9 fmt.Printf("%d = %s",key,mf[key]) 10 } 11 }
package main func main(){ // map的值是一个函数 mf := map[int]func() int{ 1:func()int{return 10}, 2:func()int{return 20}, } // map的值是一个切片 mf1 := make(map[int][]string) mf2 := make(map[int]*[]string) }
【学习参考处:https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/directory.md】