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 a agregarle elementos. Como un conjunto de Go en realidad es un map internamente, agregar un elemento a un conjunto es idéntico a agregar una clave a un map.
Para Add un elemento a tu conjunto, simplemente asignas el valor de estructura vacío a una clave nueva:
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.
La ventaja 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 solo {} sin el nombre del tipo provoca un error de compilación: falta el tipo en el literal compuesto. El tipo siempre debe proporcionarse explícitamente al asignar un valor a una clave de map fuera de un literal de map.
Agregar elementos a un conjunto es rápido y sencillo, ya que aprovecha la eficiente implementación de map de Go y te proporciona un comportamiento real de conjunto para realizar un seguimiento de items únicos.
Desafío
FácilConstruye un sistema de seguimiento de habilidades que administre las capacidades técnicas de un desarrollador usando el modismo de conjuntos de Go. Este desafío demuestra cómo añadir nuevas habilidades a un conjunto evitando duplicados y siguiendo el progreso de aprendizaje.
Recibirás dos entradas:
- Una cadena que representa el número esperado de habilidades (por ejemplo,
"5"): solo sirve como referencia - Una cadena que contiene habilidades separadas por comas (por ejemplo,
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Tu tarea es:
- Crear un conjunto usando 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 ALL las habilidades de la cadena separada por comas (recorrer toda la rebanada, sin usar el parámetro de cantidad)
- Para cada habilidad de la entrada, añadirla al conjunto usando
struct{}{}como valor - Mostrar los resultados del procesamiento imprimiendo cada habilidad a medida que se procesa:
- Si la habilidad es nueva para el conjunto:
"Learning new skill: [skill]" - Si la habilidad ya existe en el conjunto:
"Already mastered: [skill]"
- Si la habilidad es nueva para el conjunto:
- Después de procesar todas las habilidades, mostrar un resumen del progreso:
"Skills processed: [total_processed]": usa la longitud de la rebanada de habilidades"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- Por último, listar todas las habilidades del conjunto de habilidades del desarrollador:
- Encabezado:
"Complete skill set:" - Cada habilidad en una línea separada:
"✓ [skill]"
- Encabezado:
Importante: Usa range para recorrer todas las habilidades de la rebanada, no el parámetro de cantidad. La cantidad se proporciona como referencia, pero no debe controlar tu bucle. Usa el paquete strings para dividir la cadena de entrada. Para comprobar si una habilidad ya existe antes de añadirla, usa el modismo de coma ok: _, exists := skillSet[skill]. Este desafío demuestra cómo añadir elementos a un conjunto de Go gestiona automáticamente la unicidad y, al mismo tiempo, proporciona un rendimiento de búsqueda rápido para comprobar la pertenencia.
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 count a entero (solo como 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 skills en habilidades individuales
skills := strings.Split(skillsStr, ",")
// TODO: Escribe tu código debajo
// Procesar cada skill usando range para iterar sobre TODAS las skills en el slice
// Usar el idioma comma ok: _, exists := skillSet[skill]
// Agregar nuevas skills usando: skillSet[skill] = struct{}{}
// Mostrar los resultados del procesamiento para cada skill
// Calcular y mostrar el resumen de progreso usando len(skills)
// List all skills in the complete skill set (consider sorting for consistent output)
}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 únicosPractica por tu cuenta: Compilador de Go online