A logo showing the text blog.marcnuri.com
English
Inicio»Go»Cómo usar sets en Go

Entradas Recientes

  • Fabric8 Kubernetes Client 7.2.0 está disponible!
  • Conectarse a un servidor MCP con JavaScript y AI SDK
  • Conectarse a un servidor MCP con JavaScript y LangChain.js
  • El Futuro de las Herramientas para Desarrolladores en la era de la IA
  • Conectarse a un servidor Model Context Protocol (MCP) con Java y LangChain4j

Categorías

  • Antiguo
  • Front-end
  • Go
  • Herramientas
  • Industria y negocios
  • Inteligencia Artificial
  • Java
  • JavaScript
  • Operaciones
  • Personal
  • Proyectos personales

Archivos

  • mayo 2025
  • abril 2025
  • marzo 2025
  • febrero 2025
  • enero 2025
  • diciembre 2024
  • noviembre 2024
  • agosto 2024
  • junio 2024
  • mayo 2024
  • abril 2024
  • marzo 2024
  • febrero 2024
  • enero 2024
  • diciembre 2023
  • noviembre 2023
  • octubre 2023
  • septiembre 2023
  • agosto 2023
  • julio 2023
  • junio 2023
  • mayo 2023
  • abril 2023
  • marzo 2023
  • febrero 2023
  • enero 2023
  • diciembre 2022
  • noviembre 2022
  • octubre 2022
  • agosto 2022
  • julio 2022
  • mayo 2022
  • marzo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • diciembre 2020
  • octubre 2020
  • agosto 2020
  • junio 2020
  • mayo 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • noviembre 2019
  • octubre 2019
  • julio 2019
  • diciembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • mayo 2018
  • marzo 2018
  • febrero 2018
  • noviembre 2017
  • octubre 2017
  • agosto 2017
  • julio 2017
  • enero 2017
  • julio 2016
  • enero 2016
  • diciembre 2015
  • noviembre 2015
  • diciembre 2014
  • marzo 2014
  • febrero 2011
  • junio 2008
  • mayo 2008
  • abril 2008
  • enero 2008
  • junio 2007
  • mayo 2007
  • abril 2007
  • marzo 2007

Cómo usar sets en Go

2020-01-04 en Go etiquetado Go / Map por Marc Nuri | Última actualización: 2025-02-15
English version

Introducción

Go, como lenguaje, no incluye una estructura de datos Set como Python o Java en su librería estándar. Esta es una de las características que los desarrolladores echan de menos al pasar de otros lenguajes a Go. Sin embargo, puedes implementar conjuntos de forma efectiva utilizando el tipo de datos map de Go.

En este artículo, te mostraré cómo usar mapas como sets y discutiré sus ventajas y limitaciones. Ya seas un principiante o un desarrollador de Go experimentado, esta guía te ayudará a entender cómo trabajar con sets en Go.

¿Qué es un Set?

Un set es una colección de elementos únicos sin un orden específico que gestiona automáticamente las duplicidades. Los sets son ideales cuando necesitas comprobar rápidamente si un elemento está presente en una colección o cuando quieres asegurarte de que cada entrada sea única.

Las operaciones más comunes en los sets incluyen añadir elementos, eliminar elementos, comprobar la pertenencia y realizar operaciones de conjuntos como unión, intersección y diferencia.

¿Por qué Go no tiene un tipo Set integrado?

Go enfatiza la simplicidad y el minimalismo en su librería estándar. En lugar de proporcionar estructuras de datos especializadas como los sets, Go anima a los desarrolladores a utilizar su versátil tipo map para lograr funcionalidades similares.

Usar mapas como sets

La forma más idiomática de implementar un set en Go es utilizando un mapa donde las claves representan los elementos del set. Normalmente, los valores se ignoran o se establecen en struct{} (una estructura vacía) para ahorrar memoria.

Aquí tienes un ejemplo sencillo de cómo crear un set utilizando un mapa:

package main

func main() {
    // Initialize a set using a map[string]struct{}
    set := make(map[string]struct{})

    // Add elements to the set
    set["blog.marcnuri.com"] = struct{}{}
    set["google.com"] = struct{}{}
    set["example.com"] = struct{}{}

    // Check if an element is in the set
    if _, ok := set["blog.marcnuri.com"]; ok {
        println("blog.marcnuri.com is in the set")
    }

    // Remove an element from the set
    delete(set, "google.com")

    // Iterate over the set
    for key := range set {
        println(key)
    }
}

En este ejemplo:

  • Creamos un set de strings utilizando un mapa con struct{} como tipo de valor.
  • Añadimos elementos al set utilizando las claves del mapa.
  • Comprobamos si un elemento está en el set utilizando la sintaxis coma-ok.
  • Eliminamos un elemento del set utilizando la función delete(set, "element").

¿Por qué usar struct en lugar de bool como tipo de valor?

Usar struct{} como tipo de valor es una práctica común en Go cuando no necesitas almacenar ningún dato:

  • Usar struct{} ahorra memoria porque ocupa 0 bytes.
  • Usar bool introduce ambigüedad ya que el valor podría ser false, lo que es confuso al comprobar la pertenencia.

¿Cómo comprobar si un mapa contiene una clave, la sintaxis coma-ok?

La sintaixs coma-ok es un patrón común en Go para comprobar si un mapa contiene una clave. En este ejemplo, utilizamos la sintaxis coma-ok para comprobar si la clave "blog.marcnuri.com" está en el set.

La sintaxis es la siguiente:

value, ok := myMap[key]

Cuando buscas una clave en un mapa, puedes capturar dos valores de retorno. Esto es lo que sucede:

  • value es el valor almacenado bajo esa clave si existe (o el valor cero si falta).
  • ok es un booleano que indica si se encontró la clave.

Esta sintaxis es concisa y se utiliza comúnmente en los programas de Go.

En el ejemplo, ignoramos el value y solo comprobamos si la clave existe utilizando el _ (guión bajo) para descartar el valor.

Conclusión

Aunque Go no tiene un tipo set nativo, utilizar mapas para simular el comportamiento de un set es una solución eficiente e idiomática. Este enfoque aprovecha la simplicidad y el poder de las estructuras de datos integradas de Go, permitiéndote gestionar elementos únicos sin esfuerzo.

Al entender estas técnicas y patrones, estarás bien preparado para manejar colecciones únicas en tus proyectos de Go. Happy coding!

Twitter iconFacebook iconLinkedIn iconPinterest iconEmail icon

Navegador de artículos
Entendiendo las funciones variádicas en GoQuarkus + Fabric8 Maven Plugin + GraalVM
© 2007 - 2025 Marc Nuri