在Golang中,var s []int
和s := make([]int, 0)
之间有什么区别?
我发现两者都有效,但哪一个更好?
答案 0 :(得分:90)
简单声明
var s []int
不会将记忆和s
点分配给nil
,而
s := make([]int, 0)
将内存和s
点分配给内存到具有0个元素的切片。
通常情况下,如果您不知道用例的确切大小,则第一个更具惯用性。
答案 1 :(得分:79)
除了fabriziom的answer之外,您还可以在“Go Slices: usage and internals”上看到更多示例,其中提到了[]int
的使用:
由于切片的零值(
nil
)的作用类似于零长度切片,因此您可以声明切片变量,然后在循环中附加到它:
// Filter returns a new slice holding only
// the elements of s that satisfy f()
func Filter(s []int, fn func(int) bool) []int {
var p []int // == nil
for _, v := range s {
if fn(v) {
p = append(p, v)
}
}
return p
}
这意味着,要附加到切片,您不必先分配内存:nil
切片p int[]
足以作为要添加的切片。
答案 2 :(得分:3)
更完整一点(make
中的另一个参数)示例:
slice := make([]int, 2, 5)
fmt.Printf("lenght: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
出局:
lenght: 2 - capacity 5 - content: [0 0]
或动态类型为slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("lenght: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
出局:
lenght: 2 - capacity 5 - content: [<nil> <nil>]
答案 3 :(得分:2)
刚刚发现了一个不同。如果您使用
var list []MyObjects
然后将输出编码为JSON,得到null
。
list := make([]MyObjects, 0)
按预期结果产生[]
。