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]booluno 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
golangenfoque en la simplicidad.sets llegar a ser realmente útil condifference,intersection,union,issubset, y así sucesivamente .. métodos. Quizás elgolangequipo consideró que es demasiado para una estructura de datos. Pero por lo demás, es un "conjunto tonto" que solo tieneadd,containsyremovepuede ser fácilmente replicado conmaplo 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]boolFunciona 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, suEqualsmétodo debe ser justop1 == p2.Containstoma 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 quemapproporciona el tipo. Incluso existen soluciones más rápidas que consideran el comportamiento de la caché, etc.