Crear un Set
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 32 de 68.
Ahora que entiendes el concepto detrás del modismo de conjuntos de Go, es hora de ponerlo en práctica creando tu primer conjunto. El proceso es sencillo y sigue los mismos patrones que ya has aprendido con los mapas.
Para crear un conjunto en Go, declaras una variable utilizando el patrón map[T]struct{}, donde T es el tipo de elementos que quieres almacenar. Aquí tienes cómo crear un conjunto para almacenar nombres de colores únicos:
colors := make(map[string]struct{})También puedes inicializar un conjunto con algunos valores iniciales utilizando la sintaxis de literal de mapa:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Observa cómo cada valor es un literal de struct vacío {}. Esto crea el valor cero de struct{}, que no ocupa espacio en memoria mientras permite que la clave exista en el mapa.
La belleza de este enfoque es que aprovecha la infraestructura de mapas existente de Go mientras proporciona una verdadera semántica de conjuntos: cada nombre de color solo puede aparecer una vez y obtienes tiempos de búsqueda rápidos al igual que con los mapas regulares.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilCrea un rastreador de preferencias de lenguajes de programación que demuestre el modismo de conjuntos (set idiom) en Go para almacenar elementos únicos. Este desafío muestra cómo usar el patrón map[string]struct{} para rastrear lenguajes de programación sin duplicados.
Recibirás dos entradas:
- Una cadena que representa el número de lenguajes a procesar (por ejemplo,
"6") - Una cadena que contiene lenguajes de programación separados por comas (por ejemplo,
"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")
Tu tarea es:
- Crear un conjunto utilizando el modismo de Go
map[string]struct{}para almacenar lenguajes de programación únicos - Analizar la cadena de entrada dividiéndola por comas para obtener los nombres de los lenguajes individuales
- Agregar cada lenguaje a tu conjunto utilizando el literal de estructura vacía
{}como valor - Mostrar los resultados del procesamiento imprimiendo cada lenguaje a medida que se encuentra:
- Si el lenguaje es nuevo en el conjunto:
"Added: [language]" - Si el lenguaje ya existe en el conjunto:
"Already exists: [language]"
- Si el lenguaje es nuevo en el conjunto:
- Después de procesar todos los lenguajes, mostrar un resumen:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- Finalmente, listar todos los lenguajes únicos en el conjunto:
- Encabezado:
"Programming languages in set:" - Cada lenguaje en una línea separada:
"- [language]"
- Encabezado:
Usa el paquete strings para dividir la cadena de entrada y el paquete strconv para convertir la cadena de conteo en un entero. Para verificar si un lenguaje ya existe en el conjunto antes de agregarlo, usa el modismo comma ok: _, exists := languageSet[language]. Este desafío demuestra cómo el modismo de conjuntos en Go proporciona una forma eficiente de rastrear elementos únicos y evitar duplicados en tus datos.
Hoja de referencia
Para crear un conjunto (set) en Go, utiliza el patrón map[T]struct{} donde T es el tipo de elemento:
colors := make(map[string]struct{})También puedes inicializar un conjunto con valores iniciales utilizando la sintaxis de literales de mapa:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Cada valor es un literal de estructura vacía {} que crea el valor cero de struct{} y no ocupa espacio en memoria, permitiendo al mismo tiempo que la clave exista en el mapa.
Para comprobar si un elemento existe en el conjunto, utiliza el modismo "comma ok":
_, exists := languageSet[language]Pruébalo tú mismo
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Leer entrada
var countStr string
var languagesStr string
fmt.Scanln(&countStr)
fmt.Scanln(&languagesStr)
// Convertir la cadena de conteo a entero (no es necesario para este desafío)
_, _ = strconv.Atoi(countStr)
// Dividir la cadena de lenguajes por comas
languages := strings.Split(languagesStr, ",")
// Crear un conjunto usando el modismo map[string]struct{}
languageSet := make(map[string]struct{})
// TODO: Escribe tu código a continuación
// Procesar cada lenguaje y verificar si existe en el conjunto
// Usar el modismo comma ok: _, exists := languageSet[language]
// Imprimir "Added: [language]" o "Already exists: [language]"
// Agregar lenguajes al conjunto usando un literal de estructura vacía {}
// Imprimir información de resumen
// Imprimir el total de lenguajes procesados y el conteo de lenguajes únicos
// Imprimir todos los lenguajes únicos en el conjunto
fmt.Println("Programming languages in set:")
// Convertir el mapa a slice y ordenar para una salida consistente
// Listar cada lenguaje con el formato "- [language]"
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos