Eu realmente gosto do google golang, mas alguém poderia explicar qual é a lógica para os implementadores terem deixado de fora uma estrutura de dados básica, como conjuntos da biblioteca padrão?
69
Eu realmente gosto do google golang, mas alguém poderia explicar qual é a lógica para os implementadores terem deixado de fora uma estrutura de dados básica, como conjuntos da biblioteca padrão?
Respostas:
Um motivo potencial para essa omissão é que é realmente fácil modelar conjuntos com um mapa.
Para ser sincero, acho que também é um pouco de supervisão, no entanto, olhando para Perl, a história é exatamente a mesma. No Perl, você obtém listas e hashtables, no Go, obtém matrizes, fatias e mapas. No Perl, você geralmente usa uma hashtable para todo e qualquer problema relacionado a um conjunto, o mesmo se aplica ao Go.
Exemplo
para imitar um conjunto de entradas no Go, definimos um mapa:
Adicionar algo é tão fácil quanto:
Excluir algo é apenas
E o constrangimento potencial dessa construção é facilmente abstraído:
E delete e get podem ser definidos da mesma forma, eu tenho a implementação completa aqui . A principal desvantagem aqui é o fato de que go não possui genéricos. No entanto, é possível fazer isso,
interface{}
caso em que você lançaria os resultados de get.fonte
map[int]bool
um pode usar em seumap[int]struct{}
lugar. Eu prefiro o último.map[int]struct{}
.. Ostruct{}
leva 0 bytes.map[int]struct{}
você não pode fazerif mymap["key"] {
para verificar a adesão. O Google recomenda o usobool
(pesquise "Um conjunto pode ser implementado").Eu acho que isso tem a ver com o
golang
foco na simplicidade.set
s se tornar realmente útil comdifference
,intersection
,union
,issubset
, e assim por diante .. métodos. Talvez agolang
equipe tenha achado que é demais para uma estrutura de dados. Mas caso contrário, um "conjunto de burro" que só temadd
,contains
eremove
pode ser facilmente replicado commap
como explicado por @jozefg.fonte
A resposta anterior funciona apenas se a chave for do tipo interno. Para complementar a resposta anterior, aqui está uma maneira de implementar um conjunto cujos elementos são tipos definidos pelo usuário:
fonte
type mySet map[IntPoint]bool
funciona perfeitamente bem. Tudo o que é necessário para o tipo de chave usado em um mapa é que ele possui==
e!=
. A igualdade dos tipos de estrutura está bem definida, seuEquals
método deve ser justop1 == p2
.Contains
leva tempo linear, enquantoaMap[]
leva tempo constante, independentemente do número de membros. Uma solução melhor criaria internamente uma chave exclusiva com base no conteúdo de cada membro e alavancaria a consulta em tempo constante que omap
tipo fornece. Soluções ainda mais rápidas que consideram o comportamento do cache etc. também existem.