Um motivo potencial para essa omissão é que é realmente fácil modelar conjuntos com um mapa.
Para ser honesto, acho que também é um pouco de descuido, mas olhando para Perl, a história é exatamente a mesma. Em Perl você obtém listas e hashtables, em Go você obtém matrizes, fatias e mapas. Em Perl você geralmente usaria um hashtable para todos e quaisquer problemas relacionados a um conjunto, o mesmo é aplicável ao Go.
Exemplo
para imitar um conjunto de ints em Go, definimos um mapa:
set := make(map[int]bool)
Para adicionar algo é tão fácil quanto:
i := valueToAdd()
set[i] = true
Excluir algo é apenas
delete(set, i)
E o constrangimento potencial dessa construção é facilmente abstraído:
type IntSet struct {
set map[int]bool
}
func (set *IntSet) Add(i int) bool {
_, found := set.set[i]
set.set[i] = true
return !found //False if it existed already
}
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 não tem genéricos. No entanto, é possível fazer isso com interface{}
, caso em que você teria lançado os resultados de get.