Golang – 正确的方法来初始化空片

要声明一个空白的分片,并且大小不固定,最好这样做:

mySlice1 := make([]int, 0) 

要么 :

 mySlice2 := []int{} 

只是想知道哪一个是正确的方法。

干杯

你给出的两个select在语义上是相同的,我会假设他们产生相同的汇编指令。

为了避免不必要的分配,如果最终不使用分片,可以将其保留nil值:

  var myslice []int 

正如Golang.org博客中所写:

一个零切片在function上等价于一个零长度切片,即使它没有指向任何东西。 它的长度为零,可以附加到分配。

它们是相同的。 看到这个代码:

 mySlice1 := make([]int, 0) mySlice2 := []int{} fmt.Println("mySlice1", cap(mySlice1)) fmt.Println("mySlice2", cap(mySlice2)) 

输出:

 mySlice1 0 mySlice2 0 

两个切片都具有0容量,这意味着两个切片都具有0长度(不能大于容量),这意味着两个切片都没有元素。 这意味着2片在每个方面是相同的。

Go中的空片和零片初始化方式不同:

 var nilSlice []int emptySlice1 := make([]int, 0) emptySlice2 := []int{} fmt.Println(nilSlice == nil) // true fmt.Println(emptySlice1 == nil) // false fmt.Println(emptySlice2 == nil) // false 

至于三片,len和cap都是0。

除了@ANisus的答案…

下面是一些来自“Go in action”的书籍,我认为这是值得一提的:

nilempty片之间的区别

如果我们想像这样的一个片段:

 [pointer] [length] [capacity] 

然后:

 nil slice: [nil][0][0] empty slice: [addr][0][0] // points to an address 

无片

当你想表示一个不存在的切片时,比如在一个返回一个切片的函数中发生exception时,它们非常有用。

 // Create a nil slice of integers. var slice []int 

空片

当你想要表示一个空的集合,比如当数据库查询返回零结果时,空片是有用的。

 // Use make to create an empty slice of integers. slice := make([]int, 0) // Use a slice literal to create an empty slice of integers. slice := []int{} 

不pipe你使用的是一个零分片还是一个空片,内置的函数appendlencap都是一样的。


去操场的例子 :

 package main import ( "fmt" ) func main() { var nil_slice []int var empty_slice = []int{} fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice)) fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice)) } 

打印:

 true 0 0 false 0 0