【概念】
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】
Go笔记-map
原文:http://www.cnblogs.com/ymkfnuiwgij/p/7895017.html