var
var 变量名字 类型 = 表达式
如果初始化表达式被省略,那么将用零值初始化该变量。
- 数值类型变量对应的零值是
0
- 布尔类型变量对应的零值是
false
- 字符串类型对应的零值是
空字符串
- 接口或引用类型(包括slice、指针、map、chan和函数)变量对应的零值是
nil
- 数组或结构体等聚合类型对应的零值是 每个元素或字段都是对应该类型的零值 。
var t []string
比 t := []string{}
更好
初始化类型,而且对于引用类型的变量,我们不光要声明它,还要为它分配内存空间.new和make都可以用来分配空间,
make([]T, length, capacity)
make
主要用来初始化内置数据结构.包括 slice
, map
和 channel
,返回该类型已初始化(非零值)的值.
需要注意的是这三种类型本身就是引用类型.
slice
是一个包含data
(指向数组的指针)、cap
和len
的结构体;map
是一个指向hmap
结构体的指针;channel
是一个指向hchan
结构体的指针;
使用 make
的好处是可以指定 len
和 cap
, make(type,len,cap)
,合适的 len
和 cap
可以提升性能。
slice := make([]int, 100)
hash := make(map[sting]string, 100)
channel := make(chan int, 100)
注意:
var s1 []int
s2 := make([]int, 3)
var m1 map[string]string
m2 := make(map[string]string, 3)
var c1 chan int
c2 := make(chan int, 3)
slice s1 的零值是 []int(nil)
等于 nil
, 而通过make初始化之后的s2是 []int{0, 0, 0}
,不要把内部=int=型的零值当成了slice的零值.
同样的map的零值是 map[string]string(nil)
等于 nil
, 通过make初始化之后是 map[string]string{}
chain的零值是 (chain int)(nil)
等于 nil
, 通过make初始化之后是 (chan int)(0xc0000a0080)
new(T)
使用new来获取指向某个类型的指针,指针指向新分配的,该类型的零值.
w := new(sync.WaitGroup)
w := &sync.WaitGroup{}
这两者等价.
参考链接
https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-make-and-new/