go中声明变量有很多方式,五花八门(乱七八糟),实际上写多了会固化几种写法,比如全局变量会在外面用var声明,方法内变量一般都是 x := xxx 这样,至于channel、slice、map都会使用make关键字,而new实际当中用的很少
var
使用var关键字声明变量,系统会默认为变量分配内存空间,并赋值该类型的0值
1 | var i int |
如果声明指针类型的变量,就不会分配内存空间,默认是nil
1 | var i *int |
此时需要配合new关键字使用,i指向一块内存空间
1 | i = new(int) |
new和make的区别
new 和 make 都会分配内存,new返回指向该类型内存地址的指针,并赋值该类型的0值,make只能用于channel、slice、map,返回的是引用类型,并初始化该类型
项目中使用较多的是slice,如果我们能明确知道slice的长度,声明的时候直接指定,能够避免reslice扩容造成的元素搬迁(追求性能,不过也是一个好习惯)
s := make([]int, 0, 10)
如果不能明确知道,一般这么定义
s := make([]int, 0)
今天发现一段代码这么定义直接使用的
var s []int
在实际项目中一直习惯于用make关键字来初始化slice,很少用关键字var,这种定义的slice为nil,比较好奇为啥没有出错,查看发现后面用了append操作,append操作可以接收nil的切片,在内部会使用mallocgc进行内存分配,所以这么写是可以的,觉得容易记混的话,还是都使用make来进行初始化,就会避免出现不必要的bug