go变量初始化
var
var 关键字用于初始化变量(所有类型)并赋值,如果没有显示赋值,则隐式赋该类型的零值:
1 | var name type [= value] |
示例:
1 | type User struct { |
使用var
一般不会显式赋值,如果需要显式赋值,一般使用:=
。
1 | s := "hello word" |
new()
1 | new(T) |
T
可以是任何类型,new(T)
会初始化变量,并赋值变量T
类型的零值,然后返回该变量的指针。
以T
为string
为例,模拟 new(string)
:
1 | func newString() *string { |
1 | func main() { |
make()
new(T)
适合初始化值类型的变量,因为返回其指针,后续传递可以传递该指针,避免值拷贝。
new(T
不适合初始化引用类型的变量,因为传递引用类型的变量没有值拷贝的问题。T
是引用类型,则返回指针的指针,意义不大。
make()
用于初始化 slice、map 或 chan(只有这三种类型)的变量。
make([]T, len[, cap])
初始化 slice 类型的变量,指定 len 和 cap。
如果不指定 cap,则 cap 等于 len。
make(map[T1]T2)
初始化 map 类型的变量,不指定 len,更没有 cap。
make(chan T[, len])
channel 必须通过 make 创建,var c chan int
这种形式创建的是 nil channel,是不能用的,无论收发都会被堵塞。
1 | // 无缓存channel |
nil 切片与空切片
1 | var s1 []int // nil切片 |
- nil 切片和空切片指向的地址不一样。nil 空切片引用数组指针地址为 0(无指向任何实际地址);
- 空切片的引用数组指针地址是有的,且固定为一个值。