В Голанге, в чем разница между var s []int
и s := make([]int, 0)
?Объявить ломтик или сделать ломтик?
Я нахожу, что обе работы, но какая из них лучше?
В Голанге, в чем разница между var s []int
и s := make([]int, 0)
?Объявить ломтик или сделать ломтик?
Я нахожу, что обе работы, но какая из них лучше?
В дополнение к 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[]
достаточно, чтобы добавить его.
Спасибо! Это то, что мне нужно. –
Простая декларация
var s []int
не выделяет память и s
указывает на nil
, в то время как
s := make([]int, 0)
выделяет память и s
указывает на память срезу с 0 элементами.
Обычно первый из них более идиоматичен, если вы не знаете точный размер вашего прецедента.
Могу ли я сказать то же самое для карты? var m map [string] int vs m: = make (map [string] int)? Благодарю. – joshua
Ну, вам нужно «сделать» карты, потому что даже пустой «карте» требуется пространство, выделенное для некоторой бухгалтерии. – twotwotwo
Если вам нужно вернуть срез с 0 элементами (вместо «nil»), make будет правильным использованием. – Jess
Первый создает «nil' срез, тогда как второй создает« пустой »срез (это терминология, используемая *« Go in action book »*). Чтобы не публиковать тот же ответ здесь, вы можете проверить https://stackoverflow.com/a/45997533/1561148 – tgogos