什么是map?
概念性的东西百度已经烂大街,啰嗦一大堆毫无价值意义,直接剖析本篇的议题:当map在不提前分配内存的时候为什么会抛异常?
议题开始
- 先看下面代码
package main import ( "fmt" ) func main() { var a map[string]string a["name"] = "hello" fmt.Println(a) }
- 运行代码后GG了
异常就对了,不抛异常还真就不正常了。
- 为何异常
为啥抛出panic异常了?因为map是引用类型,必须先分配内存空间,直接就给key和vaule肯定不行,因为没地方存呢!
引用类型最大的特点就是变量存储的是一个地址,这个地址对应的空间里才是真正存储的值。所以说,连内存空间都不提前分配,怎么可以存储东东进去呢!
引用类型有:
- slice
- channel
- map
- 使用make来创建map
make()是Go语言内存分配的内置函数,使用它来创建map
package main import ( "fmt" ) func main() { var a map[string]string a = make(map[string]string, 10) fmt.Println(a) }
执行后
很明显,已经可以得到一个可以存东东的map了,容量是10,key和value都是字符串。给定的容量是10,有个好处是:提前申请好额外的内存空间,这样可以避免二次分配内存带来的开销,可以提高程序的性能。
- 还可以简写成
a := make(map[string]string, 10)
- 可以存东东了
package main import ( "fmt" ) func main() { a := make(map[string]string, 10) a["name"] = "bubeiguoyunwei" fmt.Println(a) }
- 还有一个玩法
package main import "fmt" func main() { a := map[string]string{ "name": "root", "ip": "10.1.1.1", } fmt.Println(a) }
咦!不用make了?map数据类型初始化是有两种方式的,如下:
- make(map[string]string)
- map[string]string{}
写在最后
本篇的分享告一段落,PS:很久没分享东西了,最近人变懒了,但再懒也要月更一次,也就那点情怀了。