Añadir a un Set
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 33 de 68.
Ahora que has creado un conjunto, el siguiente paso es aprender cómo añadirle elementos. Dado que un conjunto en Go es en realidad un mapa por debajo, añadir un elemento a un conjunto es idéntico a añadir una clave a un mapa.
Para añadir un elemento a tu conjunto, simplemente asignas el valor de la estructura vacía a una nueva clave:
colors["yellow"] = struct{}{}La sintaxis struct{}{} crea un literal de estructura vacío. El primer struct{} especifica el tipo, y el segundo {} lo inicializa. Esta es la forma estándar de añadir elementos a un conjunto en Go.
Lo bueno de este enfoque es que si intentas añadir el mismo elemento de nuevo, simplemente sobrescribe la entrada existente, manteniendo la propiedad de unicidad del conjunto.
Ten en cuenta que struct{}{} es la única sintaxis válida para esta asignación; escribir simplemente {} sin el nombre del tipo provoca un error de compilación: missing type in composite literal. El tipo siempre debe proporcionarse explícitamente al asignar un valor a una clave de mapa fuera de un literal de mapa.
Agregar elementos a un conjunto es rápido y sencillo, aprovechando la eficiente implementación de map de Go mientras te brinda un comportamiento de conjunto real para el seguimiento de elementos únicos.
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ácilConstruye un sistema de seguimiento de habilidades que gestione las capacidades técnicas de un desarrollador utilizando el modismo de conjunto (set) en Go. Este desafío demuestra cómo agregar nuevas habilidades a un conjunto evitando duplicados y realizando un seguimiento del progreso de aprendizaje.
Recibirás dos entradas:
- Una cadena que representa el número esperado de habilidades (por ejemplo,
"5"); esto es solo para referencia. - Una cadena que contiene habilidades separadas por comas (por ejemplo,
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Tu tarea es:
- Crear un conjunto utilizando el modismo de Go
map[string]struct{}para almacenar habilidades técnicas únicas - Inicializar el conjunto con tres habilidades iniciales:
"Programming","Problem Solving", y"Communication" - Analizar la cadena de entrada dividiéndola por comas para obtener los nombres de las habilidades individuales
- Procesar TODAS las habilidades de la cadena separada por comas (itera a través de todo el slice, sin usar el parámetro de conteo)
- Para cada habilidad de la entrada, agrégala a tu conjunto usando
struct{}{}como valor - Mostrar los resultados del procesamiento imprimiendo cada habilidad a medida que se procesa:
- Si la habilidad es nueva en el conjunto:
"Learning new skill: [skill]" - Si la habilidad ya existe en el conjunto:
"Already mastered: [skill]"
- Si la habilidad es nueva en el conjunto:
- Después de procesar todas las habilidades, mostrar un resumen del progreso:
"Skills processed: [total_processed]"- usa la longitud del slice de habilidades"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- Finalmente, listar todas las habilidades en el conjunto de habilidades del desarrollador:
- Encabezado:
"Complete skill set:" - Cada habilidad en una línea separada:
"✓ [skill]"
- Encabezado:
Importante: Usa range para iterar sobre todas las habilidades en el slice, no el parámetro de conteo. El conteo se proporciona como referencia pero no debe controlar tu bucle. Usa el paquete strings para dividir la cadena de entrada. Para verificar si una habilidad ya existe antes de agregarla, usa el modismo comma ok: _, exists := skillSet[skill]. Este desafío demuestra cómo agregar elementos a un conjunto en Go maneja automáticamente la unicidad mientras proporciona un rendimiento de búsqueda rápido para las pruebas de pertenencia.
Hoja de referencia
Para añadir elementos a un conjunto de Go (implementado como map[string]struct{}), asigna una estructura vacía a una nueva clave:
colors["yellow"] = struct{}{}La sintaxis struct{}{} crea un literal de estructura vacía. El primer struct{} especifica el tipo, y el segundo {} lo inicializa. Esta es la forma estándar de añadir elementos a un conjunto en Go.
Pruébalo tú mismo
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Leer entrada
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// Convertir la cadena de conteo a entero (solo para referencia - no se usa en el bucle)
_, _ = strconv.Atoi(countStr)
// Inicializar el conjunto de habilidades con habilidades iniciales
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// Dividir la cadena de habilidades en habilidades individuales
skills := strings.Split(skillsStr, ",")
// TODO: Escribe tu código a continuación
// Procesar cada habilidad usando range para iterar sobre TODAS las habilidades en la rebanada (slice)
// Usar el modismo comma ok: _, exists := skillSet[skill]
// Agregar nuevas habilidades usando: skillSet[skill] = struct{}{}
// Mostrar los resultados del procesamiento para cada habilidad
// Calcular y mostrar el resumen del progreso usando len(skills)
// Listar todas las habilidades en el conjunto completo de habilidades (considerar ordenar para una salida consistente)
}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 comportamientos6Go idiomático: Sets
El modismo de Set en GoCrear un SetAñadir a un SetComprobar pertenenciaEliminar de un SetIterar sobre un SetResumen: Nombres de usuario únicos