2014-08-28 92 views
44

在Golang,var s []ints := make([]int, 0)有什么不同?声明切片或制作切片?

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

+0

第一个创建一个“无”切片,而第二个创建一个“空”切片(这是*“Go in action book”使用的术语*)。为了避免在这里发布相同的答案,您可以查看https://stackoverflow.com/a/45997533/1561148 – tgogos 2017-09-01 10:30:27

回答

46

除了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[]就足以作为要添加到的分片。

+0

谢谢!这是我需要的。 – 2014-08-28 09:56:40

55

简单声明

var s []int 

不分配存储器和snil,而

s := make([]int, 0) 

分配内存和s指向的内存与0个元素的切片。

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

+0

我可以说地图一样吗? var m map [string] int vs m:= make(map [string] int)?谢谢。 – joshua 2015-03-06 07:46:32

+7

不,您需要制作地图,因为即使是空的“地图”也需要分配一些簿记空间。 – twotwotwo 2015-08-07 20:09:42

+5

如果您需要返回0个元素的片(而不是'nil'),make是正确的用法。 – Jess 2016-04-21 15:28:13