在Golang,var s []int
和s := make([]int, 0)
有什么区别?
我发现两者都有效,但哪一个更好?
除了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[]
足以作为要添加的切片。
简单的声明
var s []int
没有分配内存和s
指向nil
,而
s := make([]int, 0)
将内存和s
指向内存分配给具有0个元素的切片。
通常,如果您不知道用例的确切大小,则第一个更惯用。
更完整(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>]
刚发现差异。如果你使用
var list []MyObjects
然后你将输出编码为JSON,你得到null
。
list := make([]MyObjects, 0)
按预期结果[]
。