【golang学习笔记】map
2018-02-28 00:00
274 查看
map学习笔记
golang中的map数据结构类似于java中的HashMap,能够自动扩容,非并发安全,并且key是无序的。关于为什么在golang中map是内建的数据结构,可以见golang官方faq:https://golang.org/doc/faq#builtin_maps(国内可以使用这个网址访问:https://golang.google.cn/doc/faq#builtin_maps)
map的基本用法
// map的声明方式 var map1 map[keytype]valuetype // 由于map是引用类型,因此必须显示初始化,否则默认值是nil var si map[string]int fmt.Println(si == nil) // true si["monday"] = 1 //panic: assignment to entry in nil map //map的初始化方式主要有两种:make方式和literal方式 // 1.采用make分配内存 //采用默认大小 var map1 map[string]int = make(map[string]int) // 显示指定大小,如果你要往map放入大量数据,最好在新建map的时候显示指定map大小, // 否则会导致map频繁扩容,影响性能 var map1 map[string]int = make(map[string]int, 100) map1["age"] = 1 // 2.literal方式初始化 map1 := map[string]int{ "Monday": 1, "Tuesday":2 } map的常用操作:get、set、delete // 1.set:给map赋值 map1["Wednesday"] = 3 // 2.get:根据指定key从map中获取value //根据key获取map中的value,这里如果指定key在map中不存在的话 //会返回valuetype的"零值"(golang中的"零值"定义TODO) fmt.Println(map1["Wednesday"]) // print 3 fmt.Println(map1["hello"]) // print 0 (0 是int类型的零值) //为了避免这种情况可以使用下面的赋值语句进行测试 v, ok := map1["Wednesday"] if v, ok := map1["Wednesday"]; ok { //process } // 3.delete:根据指定key从map中删除值 delete(map1, "Monday") // 4.通过len()获取map当前的大小,不能对map使用cap() fmt.Println(len(map1))
map的key说明:官方文档中阐述只要是任何定义了equal操作的类型都可以当做map的key,比如integers, floating point and complex numbers, strings, pointers, interfaces,channel、structs 和 arrays。而func、slice、map不能作为key,因为它们没有定义equal操作。对于struct、interface和array来说,如果它们要作为key,必须它们包含的元素都可以作为key才行,如下测试代码:
type Person struct { name string age int } type Person2 struct { name string age int friends []string } // struct作为map的key测试 var test map[Person]int = make(map[Person]int) // struct类型作为key test[Person{"fuqiu", 20}] = 100 fmt.Println(test[Person{"fuqiu", 20}]) // 输出100 // interface作为map的key测试 keyArray := [2]interface{}{1, "2"} var keyArrayMap map[[2]interface{}]int = make(map[[2]interface{}]int) keyArrayMap[keyArray] = 10000 fmt.Println(keyArrayMap[keyArray]) // 输出10000 // interface{}类型作为key,但是其中包含func(){}元素,此时运行时报错 keyArray2 := [2]interface{}{1, func(){}} // 报错信息:panic: runtime error: hash of unhashable type func() var keyArrayMap2 map[[2]interface{}]int = make(map[[2]interface{}]int) keyArrayMap2[keyArray2] = 20000 fmt.Println(keyArrayMap2[keyArray2]) //使用包含了slice的struct作为key,因为slice不能作为map的key,因此运行时报错 var test2 map[Person2]int = make(map[Person2]int) test2[Person2{"fuqiu", 20, []string{"1", "2"}}] = 1000 fmt.Println(test2[Person2{"fuqiu", 20, []string{"1", "2"}}]) // 报错信息:invalid map key type Person2
valuetype说明:可以是任意类型的;通过使用interface{}类型,我们可以存储任意值
在声明的时候不需要知道 map 的长度,map 是可以动态增长的。
未初始化的 map 的值是 nil
map一些需要注意的点
map 是引用类型map的key是无序的(TODO:如何实现有序)
不要使用 new,永远用 make 来构造 map,如果你错误的使用 new() 分配了一个引用对象,你会获得一个空引用的指针,相当于声明了一个未初始化的变量并且取了它的地址
mapCreated := new(map[string]float32) // 以下操作编译器会报错:invalid operation: mapCreated["key1"] (index of type *map[string]float32). mapCreated["key1"] = 4.5
map的一些使用技巧
map[string]bool 来实现set的效果map[string]func(){}
map的实现原理
TODO参考资料
the-way-to-goeffective go
相关文章推荐
- Golang学习笔记(四):array、slice、map
- IOS 学习笔记(13) 地图map
- Android Map开发基础知识学习笔记
- C++学习笔记-----std::pair作为unordered_map的key
- Scala学习笔记06【Tuple、Array、Map、文件实战入门】
- Golang学习笔记:常见问题
- python学习笔记-Day04-第三部分(内置函数,map,filter,reduce,yield)
- (37)Java学习笔记——集合框架 / Map集合
- Scala学习笔记04_Map与Tuple
- 黑马学习笔记--双例集合(Map)
- List,Set,Map学习笔记(1)
- Android Map开发基础知识学习笔记
- Hadoop学习笔记(二):从map到reduce的数据流
- 集合Map,HashMap、TreeMap+JAVA学习笔记-DAY18
- 黑马程序员---Map集合 学习笔记
- Golang学习笔记(1)---go程序一般结构
- 你不知道的Java学习笔记18--Map
- spark学习笔记:flatMap()(API操作报错)
- [Spring学习笔记 2 ]装配各种类型的属性 map,list,array,null,properties