В Go в чем разница между var s []int
и s := make([]int, 0)
?
Я считаю, что оба работают, но какой из них лучше?
go
allocation
slice
Ван И
источник
источник
nil
срез, а второй -empty
срез (это терминология, используемая в «Книге действий» ). Чтобы не публиковать здесь тот же ответ, вы можете проверить stackoverflow.com/a/45997533/1561148Ответы:
В дополнении к fabriziom «s ответа , вы можете увидеть больше примеров на„ Go Ломтиках: использование и внутренние органы “, где использование для
[]int
упоминаются:Это означает, что для добавления к срезу вам не нужно сначала выделять память:
nil
срезаp int[]
достаточно в качестве среза для добавления.источник
var p []int
проще, чем использоватьmake
(которое я больше связываю с распределением, хотя с ограничением 0 оно ничего не выделяет). Что касается удобочитаемости, я предпочитаю не использоватьmake
здесь.p := []int{}
). Поскольку мы обычно используем:=
синтаксис для объявления большинства переменных, более естественно иметь его везде, вместо того, чтобы иметь исключения для срезов. Помимо этого попытки думать о распределении обычно подталкивают людей к преждевременной оптимизации.Простое объявление
не выделяет память и
s
указывает наnil
, в то время каквыделяет память и
s
указывает в памяти на срез с 0 элементами.Обычно первый вариант более идиоматичен, если вы не знаете точного размера вашего варианта использования.
источник
make
карты, потому что даже пустое местоmap
требует места для какой-то бухгалтерии.nil
в случае, если ваш фрагмент не имеет никакого элемента, а не пустой массив. Однако, еслиmake
он используется для создания среза, вместо него будет возвращен пустой массив, что обычно является желаемым эффектом.var s []int
) произведетnull
, в то время как маршалинг пустого slice (s := make([]int, 0)
) произведет ожидаемый результат[]
Только что нашел разницу. Если вы используете
а затем вы кодируете вывод как JSON, вы получаете
null
.приводит
[]
к ожидаемым результатам.источник
Немного более полный (еще один аргумент
make
) пример:Вне:
Или с динамическим типом
slice
:Вне:
источник