申报切片还是制作切片?

在围棋中,var s []ints := make([]int, 0)的区别是什么?

我发现这两种方法都有效,但是哪一种更好呢?

84760 次浏览

简单的声明

var s []int

不会将内存和 s点分配给 nil,而

s := make([]int, 0)

将内存和 s点分配给一个包含0个元素的片。

通常,如果您不知道您的用例的确切大小,那么第一个用例会更加惯用。

除了 (法语)回答,你可以在“ 切片: 使用和内部”看到更多的例子,其中提到了 []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
}

这意味着,要附加到一个片,您不必首先分配内存: nilp int[]作为一个片足以添加到。

一个更完整的例子(.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 := 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

list := make([]MyObjects, 0)

结果如预期的 []