В Go в чем разница между var s []int
и s := make([]int, 0)
?
Я считаю, что оба работают, но какой из них лучше?
Ответы:
В дополнении к fabriziom «s ответа , вы можете увидеть больше примеров на„ Go Ломтиках: использование и внутренние органы “, где использование для []int
упоминаются:
Поскольку нулевое значение slice (
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[]
достаточно в качестве среза для добавления.
var p []int
проще, чем использовать make
(которое я больше связываю с распределением, хотя с ограничением 0 оно ничего не выделяет). Что касается удобочитаемости, я предпочитаю не использовать make
здесь.
p := []int{}
). Поскольку мы обычно используем :=
синтаксис для объявления большинства переменных, более естественно иметь его везде, вместо того, чтобы иметь исключения для срезов. Помимо этого попытки думать о распределении обычно подталкивают людей к преждевременной оптимизации.
Простое объявление
var s []int
не выделяет память и s
указывает на nil
, в то время как
s := make([]int, 0)
выделяет память и s
указывает в памяти на срез с 0 элементами.
Обычно первый вариант более идиоматичен, если вы не знаете точного размера вашего варианта использования.
make
карты, потому что даже пустое место map
требует места для какой-то бухгалтерии.
nil
в случае, если ваш фрагмент не имеет никакого элемента, а не пустой массив. Однако, если make
он используется для создания среза, вместо него будет возвращен пустой массив, что обычно является желаемым эффектом.
var s []int
) произведет null
, в то время как маршалинг пустого slice ( s := make([]int, 0)
) произведет ожидаемый результат[]
Только что нашел разницу. Если вы используете
var list []MyObjects
а затем вы кодируете вывод как JSON, вы получаете null
.
list := make([]MyObjects, 0)
приводит []
к ожидаемым результатам.
Немного более полный (еще один аргумент make
) пример:
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Вне:
length: 2 - capacity 5 - content: [0 0]
Или с динамическим типом slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Вне:
length: 2 - capacity 5 - content: [<nil> <nil>]
nil
срез, а второй -empty
срез (это терминология, используемая в «Книге действий» ). Чтобы не публиковать здесь тот же ответ, вы можете проверить stackoverflow.com/a/45997533/1561148