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 nilfatia p int[]é suficiente como uma fatia a ser adicionada.
var p []intmais 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 makeaqui.
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 saponta para nil, enquanto
s := make([]int, 0)
aloca memória e saponta 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.
makemapas, porque mesmo um vazio mapprecisa de espaço alocado para alguma contabilidade.
nilcaso seu slice não tenha nenhum elemento, em vez de um array vazio. No entanto, se makefor 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>]
nilslice, enquanto o segundo cria umemptyslice (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