2014-08-28 117 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