Em Go, qual é a diferença entre var s []int
e s := make([]int, 0)
?
Acho que ambos funcionam, mas qual é o melhor?
go
allocation
slice
Wang Yi
fonte
fonte
nil
slice, enquanto o segundo cria umempty
slice (esta é a terminologia usada pelo "Go in action book" ). Para evitar postar a mesma resposta aqui também, você pode verificar stackoverflow.com/a/45997533/1561148Respostas:
Além fabriziom 's resposta , você pode ver mais exemplos em ' Go Slices: uso e internos ', onde um uso para
[]int
é mencionado:Isso significa que, para anexar a uma fatia, você não precisa alocar memória primeiro: a
nil
fatiap int[]
é suficiente como uma fatia a ser adicionada.fonte
var p []int
mais fácil do que usarmake
(que eu associo mais com alocação, embora com um limite 0, ela não alocaria nada). Em termos de legibilidade, prefiro não usarmake
aqui.p := []int{}
). Como geralmente usamos:=
sintaxe para declarar a maioria das variáveis, é mais natural tê-la em todos os lugares em vez de ter exceções para fatias. Fora isso, tentar pensar em alocações geralmente leva as pessoas a otimizações prematuras.Declaração simples
não aloca memória e
s
aponta paranil
, enquantoaloca memória e
s
aponta para a memória para uma fatia com 0 elementos.Normalmente, o primeiro é mais idiomático se você não souber o tamanho exato do seu caso de uso.
fonte
make
mapas, porque mesmo um vaziomap
precisa de espaço alocado para alguma contabilidade.nil
caso seu slice não tenha nenhum elemento, em vez de um array vazio. No entanto, semake
for usado para criar a fatia, um array vazio será retornado, o que geralmente é o efeito desejado.var s []int
) produziránull
, enquanto o empacotamento da fatia vazia (s := make([]int, 0)
) produzirá o esperado[]
Acabei de encontrar uma diferença. Se você usar
e então você codifica a saída como JSON, você obtém
null
.resulta
[]
conforme o esperado.fonte
Exemplo um pouco mais completo (mais um argumento
make
):Fora:
Ou com tipo dinâmico de
slice
:Fora:
fonte