Respostas:
Além fabriziom 's resposta , você pode ver mais exemplos em ' Go Slices: uso e internos ', onde um uso para []int
é mencionado:
Uma vez que o valor zero de uma fatia (
nil
) atua como uma fatia de comprimento zero , você pode declarar uma variável de fatia e, em seguida, anexá-la em um loop:
// 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
}
Isso significa que, para anexar a uma fatia, você não precisa alocar memória primeiro: a nil
fatia p int[]
é suficiente como uma fatia a ser adicionada.
var p []int
mais fácil do que usar make
(que eu associo mais com alocação, embora com um limite 0, ela não alocaria nada). Em termos de legibilidade, prefiro não usar make
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
var s []int
não aloca memória e s
aponta para nil
, enquanto
s := make([]int, 0)
aloca 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.
make
mapas, porque mesmo um vazio map
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, se make
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
var list []MyObjects
e então você codifica a saída como JSON, você obtém null
.
list := make([]MyObjects, 0)
resulta []
conforme o esperado.
Exemplo um pouco mais completo (mais um argumento make
):
slice := make([]int, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Fora:
length: 2 - capacity 5 - content: [0 0]
Ou com tipo dinâmico de slice
:
slice := make([]interface{}, 2, 5)
fmt.Printf("length: %d - capacity %d - content: %d", len(slice), cap(slice), slice)
Fora:
length: 2 - capacity 5 - content: [<nil> <nil>]
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/1561148