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/