在围棋中,var s []int和 s := make([]int, 0)的区别是什么?
var s []int
s := make([]int, 0)
我发现这两种方法都有效,但是哪一种更好呢?
简单的声明
不会将内存和 s点分配给 nil,而
s
nil
将内存和 s点分配给一个包含0个元素的片。
通常,如果您不知道您的用例的确切大小,那么第一个用例会更加惯用。
除了 (法语)的 回答,你可以在“ 切片: 使用和内部”看到更多的例子,其中提到了 []int的用法:
[]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[]作为一个片足以添加到。
p int[]
一个更完整的例子(.make()中的另一个参数) :
.make()
slice := make([]int, 2, 5) fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
退出:
length: 2 - capacity 5 - content: [0 0]
或者使用动态类型的 slice:
slice
slice := make([]interface{}, 2, 5) fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
length: 2 - capacity 5 - content: [<nil> <nil>]
只是发现了一个不同。如果你使用
var list []MyObjects
然后将输出编码为 JSON,得到 null。
null
list := make([]MyObjects, 0)
结果如预期的 []。
[]