Você diz "tamanho não fixo", mas as fatias nunca têm um tamanho fixo. A menos que você queira dizer com capacidade zero. Observe que, se você tiver uma ideia / sugestão / sugestão de qual capacidade poderá precisar, usar a versão de três argumentos é bom. Por exemplo, para criar uma fatia das chaves do mapa:keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }
As duas alternativas que você forneceu são semanticamente idênticas, mas o uso make([]int, 0)resultará em uma chamada interna para o tempo de execução.makeslice (Go 1.14).
Você também tem a opção de deixá-lo com um nilvalor:
uma fatia nula é funcionalmente equivalente a uma fatia de comprimento zero, mesmo que não aponte para nada. Tem comprimento zero e pode ser anexado a, com alocação.
A nilfatia vai, porém, json.Marshal()em"null" enquanto uma fatia vazia será inserida "[]", como apontado por @farwayer.
Nenhuma das opções acima causará alocação, como apontado por @ArmanOrdookhani.
Seja cautela: json.Marshal()vai voltar nullpara var myslice []inte []para a fatia inicializadomyslice := []int{}
farwayer
10
Também deve ter cuidado: reflect.DeepEqualfaz uma distinção entre fatias de Nil e fatias não-nil: a := []int{}, var b []int,reflect.DeepEqual(a, b) // returns false
asgaines
1
Por que você acha que isso faria uma alocação? O limite é zero, portanto nada é alocado. Todos os ponteiros para comprimento zero apontam para o mesmo local na memória: play.golang.org/p/MPOKKl_sYvw
Arman Ordookhani em
1
@ArmanOrdookhani Você está correto. Eu tentei e também descobri que estava errado ao supor instruções de montagem idênticas. Fixo!
Ambas as fatias têm 0capacidade, o que implica que ambas as fatias tenham0 comprimento (não pode ser maior que a capacidade), o que implica que ambas as fatias não possuem elementos. Isso significa que as duas fatias são idênticas em todos os aspectos.
make([]int, 0)é o melhor porque o Jetbrains GoLand não se queixa de ser "desnecessário", como no caso de []int{}. Isso é útil para escrever testes de unidade.
keys := make([]int, 0, len(m)); for k, v := range m { keys := append(keys,k) }
Respostas:
As duas alternativas que você forneceu são semanticamente idênticas, mas o uso
make([]int, 0)
resultará em uma chamada interna para o tempo de execução.makeslice (Go 1.14).Você também tem a opção de deixá-lo com um
nil
valor:Conforme escrito no blog Golang.org :
A
nil
fatia vai, porém,json.Marshal()
em"null"
enquanto uma fatia vazia será inserida"[]"
, como apontado por @farwayer.Nenhuma das opções acima causará alocação, como apontado por @ArmanOrdookhani.
fonte
json.Marshal()
vai voltarnull
paravar myslice []int
e[]
para a fatia inicializadomyslice := []int{}
reflect.DeepEqual
faz uma distinção entre fatias de Nil e fatias não-nil:a := []int{}
,var b []int
,reflect.DeepEqual(a, b) // returns false
Eles são equivalentes. Veja este código:
Resultado:
Ambas as fatias têm
0
capacidade, o que implica que ambas as fatias tenham0
comprimento (não pode ser maior que a capacidade), o que implica que ambas as fatias não possuem elementos. Isso significa que as duas fatias são idênticas em todos os aspectos.Veja perguntas semelhantes:
Qual é o sentido de ter fatia nula e fatia vazia em golang?
fatias nulas vs fatias não nulas vs fatias vazias no idioma Go
fonte
Como complemento ao @ANisus ' resposta do ...
abaixo estão algumas informações do "Entrar em ação" livro , que acho que vale a pena mencionar:
Diferença entre
nil
&empty
fatiasSe pensarmos em uma fatia como esta:
então:
Exemplo de playground :
impressões:
fonte
make
?make
não parece retornar o endereço. Eu acredito que você não pode fazer isso em uma única etapa.Fatia vazia e nula são inicializadas de maneira diferente no Go:
Quanto às três fatias, len e cap são 0.
fonte
make([]int, 0)
é o melhor porque o Jetbrains GoLand não se queixa de ser "desnecessário", como no caso de[]int{}
. Isso é útil para escrever testes de unidade.