New
与其他语言中的同名方法不同是,go中的new不会初始化内存,而仅仅是赋予零值,也就是说返回一个新分配的类型的零值的指针(*T)。这样创建的变量可以不用进一步初始化就可以直接使用。
但有时需要初始化为非零值则可以用composite literal方式。
filed name 可根据是否需要按key:value 方式填写。
`new(File)`and`&File{}`
是相同的表达
Make
make只用来创建slice, map, 和channel,并且返回的初始化的值(T)
而非零值(*T),因为这几种类型的都需要初始化才能使用。
make([]int, 10, 100)
返回的是length 10 , capacity100的slice, 而new([]int)返回一个指向零值的slice。
下面的例子可以看出区别
var p *[]int = new([]int) // allocates slice structure; \*p == nil; rarely useful
var v []int = make([]int, 100) // the slice v now refers to a new array of 100 ints
// Unnecessarily complex:
var p *[]int = new([]int)
*p = make([]int, 100, 100)
// Idiomatic:
v := make([]int, 100)
有疑问加站长微信联系(非本文作者)