Realmente me gusta Google Golang, pero ¿alguien podría explicar cuál es la razón para que los implementadores hayan omitido una estructura de datos básica como los conjuntos de la biblioteca estándar?
69
Realmente me gusta Google Golang, pero ¿alguien podría explicar cuál es la razón para que los implementadores hayan omitido una estructura de datos básica como los conjuntos de la biblioteca estándar?
Respuestas:
Una razón potencial para esta omisión es que es realmente fácil modelar conjuntos con un mapa.
Para ser honesto, creo que también es un poco descuidado, sin embargo, mirando a Perl, la historia es exactamente la misma. En Perl obtienes listas y tablas hash, en Go obtienes matrices, sectores y mapas. En Perl, generalmente usaría una tabla hash para todos y cada uno de los problemas relacionados con un conjunto, lo mismo se aplica a Go.
Ejemplo
Para imitar un conjunto de entradas en Go, definimos un mapa:
Agregar algo es tan fácil como:
Eliminar algo es solo
Y la incomodidad potencial de esta construcción se abstrae fácilmente:
Y eliminar y obtener se puede definir de manera similar, tengo la implementación completa aquí . La principal desventaja aquí es el hecho de que ir no tiene genéricos. Sin embargo, es posible hacer esto,
interface{}
en cuyo caso habría emitido los resultados de get.fuente
map[int]bool
uno puede usarmap[int]struct{}
en su lugar. Prefiero el últimomap[int]struct{}
.. Elstruct{}
toma 0 bytes.map[int]struct{}
usted no puede hacerif mymap["key"] {
para verificar la membresía. Google recomienda usarbool
(busque "Se puede implementar un conjunto").Creo que esto tiene que ver con el
golang
enfoque en la simplicidad.set
s llegar a ser realmente útil condifference
,intersection
,union
,issubset
, y así sucesivamente .. métodos. Quizás elgolang
equipo consideró que es demasiado para una estructura de datos. Pero por lo demás, es un "conjunto tonto" que solo tieneadd
,contains
yremove
puede ser fácilmente replicado conmap
lo explicado por @jozefg.fuente
La respuesta anterior funciona SOLO SI la clave es un tipo incorporado. Para complementar la respuesta anterior, aquí hay una manera de implementar un conjunto cuyos elementos son tipos definidos por el usuario:
fuente
type mySet map[IntPoint]bool
Funciona perfectamente bien. Todo lo que se requiere del tipo de clave utilizado en un mapa es que tiene==
y!=
. La igualdad de los tipos de estructura está bien definida, suEquals
método debe ser justop1 == p2
.Contains
toma tiempo lineal, mientras queaMap[]
toma tiempo constante, independientemente del número de miembros. Una solución mejor crearía internamente una clave única basada en el contenido de cada miembro y aprovecharía las consultas de tiempo constante quemap
proporciona el tipo. Incluso existen soluciones más rápidas que consideran el comportamiento de la caché, etc.