Existe alguma maneira mais simples / agradável de obter uma fatia de chaves de um mapa no Go?
Atualmente, eu estou iterando sobre o mapa e copiando as chaves para uma fatia:
i := 0
keys := make([]int, len(mymap))
for k := range mymap {
keys[i] = k
i++
}
Respostas:
Por exemplo,
Para ser eficiente no Go, é importante minimizar as alocações de memória.
fonte
mymap
não for uma variável local (e, portanto, estiver sujeita a aumentar / diminuir), esta é a única solução adequada - ela garante que, se o tamanho dasmymap
alterações mudar entre a inicializaçãokeys
e ofor
loop, não haverá nenhuma saída. questões de limites.Esta é uma pergunta antiga, mas aqui estão meus dois centavos. A resposta do PeterSO é um pouco mais concisa, mas um pouco menos eficiente. Você já sabe o quão grande será, então nem precisa usar o apêndice:
Na maioria das situações, provavelmente não fará muita diferença, mas não é muito mais trabalhoso. Nos meus testes (usando um mapa com 1.000.000 de
int64
chaves aleatórias e gerando a matriz de chaves dez vezes com cada método), tratava-se de 20% mais rápido para atribuir membros da matriz diretamente do que usar anexar.Embora a configuração da capacidade elimine realocações, o anexo ainda precisa fazer um trabalho extra para verificar se você atingiu a capacidade em cada anexo.
fonte
for i, k := range mymap{
,. Dessa forma, você não precisa do i ++?i, k := range mymap
,i
serão chaves ek
valores correspondentes a essas chaves no mapa. Na verdade, isso não ajudará a preencher uma fatia de chaves.Você também pode pegar uma matriz de chaves com o tipo
[]Value
pelo métodoMapKeys
de structValue
do pacote "refletir":fonte
[]string
?Uma maneira melhor de fazer isso seria usar
append
:Fora isso, você está sem sorte - o Go não é uma linguagem muito expressiva.
fonte
keys = make([]int, 0, len(mymap))
se livrará das alocações, mas espero que ainda seja mais lento.Fiz uma referência superficial dos três métodos descritos em outras respostas.
Obviamente, pré-alocar a fatia antes de puxar as teclas é mais rápido que o
append
ing, mas, surpreendentemente, oreflect.ValueOf(m).MapKeys()
método é significativamente mais lento que o último:Aqui está o código: https://play.golang.org/p/Z8O6a2jyfTH (executá-lo no playground aborta, alegando que leva muito tempo, então, bem, execute-o localmente).
fonte
keysAppend
função, você pode definir a capacidade dakeys
matriz commake([]uint64, 0, len(m))
, o que mudou drasticamente o desempenho dessa função para mim.Visite https://play.golang.org/p/dx6PTtuBXQW
fonte