声明切片还是制作切片?

时间:2014-08-28 07:51:55

标签: go allocation slice

在Golang中,var s []ints := make([]int, 0)之间有什么区别?

我发现两者都有效,但哪一个更好?

4 个答案:

答案 0 :(得分:90)

简单声明

var s []int

不会将记忆和s点分配给nil,而

s := make([]int, 0)

将内存和s点分配给内存到具有0个元素的切片。

通常情况下,如果您不知道用例的确切大小,则第一个更具惯用性。

答案 1 :(得分:79)

除了fabriziomanswer之外,您还可以在“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)

按预期结果产生[]