2014-08-28 3 views
44

В Голанге, в чем разница между var s []int и s := make([]int, 0)?Объявить ломтик или сделать ломтик?

Я нахожу, что обе работы, но какая из них лучше?

+0

Первый создает «nil' срез, тогда как второй создает« пустой »срез (это терминология, используемая *« Go in action book »*). Чтобы не публиковать тот же ответ здесь, вы можете проверить https://stackoverflow.com/a/45997533/1561148 – tgogos

ответ

46

В дополнение к fabriziom «ы answer, вы можете увидеть больше примеров у„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 
} 

Это меня ans, что для добавления к фрагменту вам не нужно сначала выделять память: nil фрагмент p int[] достаточно, чтобы добавить его.

+0

Спасибо! Это то, что мне нужно. –

55

Простая декларация

var s []int 

не выделяет память и s указывает на nil, в то время как

s := make([]int, 0) 

выделяет память и s указывает на память срезу с 0 элементами.

Обычно первый из них более идиоматичен, если вы не знаете точный размер вашего прецедента.

+0

Могу ли я сказать то же самое для карты? var m map [string] int vs m: = make (map [string] int)? Благодарю. – joshua

+7

Ну, вам нужно «сделать» карты, потому что даже пустой «карте» требуется пространство, выделенное для некоторой бухгалтерии. – twotwotwo

+5

Если вам нужно вернуть срез с 0 элементами (вместо «nil»), make будет правильным использованием. – Jess

Смежные вопросы