要声明一个大小不固定的空片, 这样做是否更好:
mySlice1 := make([]int, 0)
or:
mySlice2 := []int{}
只是想知道哪条路是正确的。
要声明一个大小不固定的空片, 这样做是否更好:
mySlice1 := make([]int, 0)
or:
mySlice2 := []int{}
只是想知道哪条路是正确的。
当前回答
作为@ANisus回答的补充…
以下是《行动起来》一书中的一些信息,我认为值得一提:
空片和空片之间的区别
如果我们这样想象切片:
[pointer] [length] [capacity]
然后:
nil slice: [nil][0][0]
empty slice: [addr][0][0] // points to an address
nil slice They’re useful when you want to represent a slice that doesn’t exist, such as when an exception occurs in a function that returns a slice. // Create a nil slice of integers. var slice []int empty slice Empty slices are useful when you want to represent an empty collection, such as when a database query returns zero results. // 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{} Regardless of whether you’re using a nil slice or an empty slice, the built-in functions append, len, and cap work the same.
去游乐场的例子:
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
其他回答
除了@ANisus的回答
当使用官方的Go MongoDb驱动程序时,nil切片也会封送成“null”,而空切片会封送成“[]”。
当使用社区支持的MGO驱动程序时,nil和空切片都将被编组到“[]”中。
参考:https://jira.mongodb.org/browse/godriver - 971
您给出的两个替代方法在语义上是相同的,但是使用make([]int, 0)将导致对运行时的内部调用。makeslice (Go 1.16)。
你也可以选择将它保留为nil值:
var myslice []int
正如Golang.org博客所写:
一个nil切片在功能上等同于一个零长度的切片,即使它不指向任何东西。它的长度为0,可以通过分配附加到。
然而,nil切片将json.Marshal()编组为“null”,而空切片将编组为“[]”,正如@farwayer指出的那样。
正如@ArmanOrdookhani所指出的,上述选项都不会导致任何分配。
空片和空片在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回答的补充…
以下是《行动起来》一书中的一些信息,我认为值得一提:
空片和空片之间的区别
如果我们这样想象切片:
[pointer] [length] [capacity]
然后:
nil slice: [nil][0][0]
empty slice: [addr][0][0] // points to an address
nil slice They’re useful when you want to represent a slice that doesn’t exist, such as when an exception occurs in a function that returns a slice. // Create a nil slice of integers. var slice []int empty slice Empty slices are useful when you want to represent an empty collection, such as when a database query returns zero results. // 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{} Regardless of whether you’re using a nil slice or an empty slice, the built-in functions append, len, and cap work the same.
去游乐场的例子:
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
它们是等价的。请看下面的代码:
mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))
输出:
mySlice1 0
mySlice2 0
两个切片的容量都为0,这意味着两个切片的长度都为0(不能大于容量),这意味着两个切片都没有元素。这意味着这两个切片在各个方面都是相同的。
参见类似的问题:
在golang中有空切片和空切片有什么意义?
在Go语言中,nil切片vs非nil切片vs空切片