Adicionando a um Conjunto
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 33 de 68.
Agora que você tem um conjunto criado, o próximo passo é aprender como adicionar elementos a ele. Como um conjunto em Go é, na verdade, um mapa por baixo, adicionar um elemento a um conjunto é idêntico a adicionar uma chave a um mapa.
Para adicionar um elemento ao seu conjunto, basta atribuir o valor da struct vazia a uma nova chave:
colors["yellow"] = struct{}{}A sintaxe struct{}{} cria um literal de struct vazio. O primeiro struct{} especifica o tipo, e o segundo {} o inicializa. Esta é a maneira padrão de adicionar elementos a um conjunto (set) em Go.
A beleza desta abordagem é que, se você tentar adicionar o mesmo elemento novamente, ele simplesmente sobrescreve a entrada existente, mantendo a propriedade de unicidade do conjunto.
Observe que struct{}{} é a única sintaxe válida para esta atribuição — escrever apenas {} sem o nome do tipo causa um erro de compilação: missing type in composite literal. O tipo deve sempre ser fornecido explicitamente ao atribuir um valor a uma chave de mapa fora de um literal de mapa.
Adicionar elementos a um conjunto é rápido e direto, aproveitando a implementação eficiente de map do Go, ao mesmo tempo que oferece o comportamento real de um conjunto para rastrear itens únicos.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
FácilConstrua um sistema de rastreamento de habilidades que gerencia as capacidades técnicas de um desenvolvedor usando o idioma de conjunto (set) do Go. Este desafio demonstra como adicionar novas habilidades a um conjunto, evitando duplicatas e rastreando o progresso do aprendizado.
Você receberá duas entradas:
- Uma string representando o número esperado de habilidades (ex:
"5") - isto é apenas para referência - Uma string contendo habilidades separadas por vírgulas (ex:
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Sua tarefa é:
- Criar um conjunto usando o idioma do Go
map[string]struct{}para armazenar habilidades técnicas únicas - Inicializar o conjunto com três habilidades iniciais:
"Programming","Problem Solving"e"Communication" - Analisar a string de entrada dividindo-a por vírgulas para obter os nomes das habilidades individuais
- Processar TODAS as habilidades da string separada por vírgulas (itere por todo o slice, não use o parâmetro de contagem)
- Para cada habilidade da entrada, adicione-a ao seu conjunto usando
struct{}{}como o valor - Exibir os resultados do processamento imprimindo cada habilidade conforme ela é processada:
- Se a habilidade for nova no conjunto:
"Learning new skill: [skill]" - Se a habilidade já existir no conjunto:
"Already mastered: [skill]"
- Se a habilidade for nova no conjunto:
- Após processar todas as habilidades, exibir um resumo do progresso:
"Skills processed: [total_processed]"- use o comprimento do slice de habilidades"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- Finalmente, listar todas as habilidades no conjunto de habilidades do desenvolvedor:
- Cabeçalho:
"Complete skill set:" - Cada habilidade em uma linha separada:
"✓ [skill]"
- Cabeçalho:
Importante: Use range para iterar sobre todas as habilidades no slice, não o parâmetro de contagem. A contagem é fornecida para referência, mas não deve controlar seu loop. Use o pacote strings para dividir a string de entrada. Para verificar se uma habilidade já existe antes de adicioná-la, use o idioma comma ok: _, exists := skillSet[skill]. Este desafio demonstra como adicionar elementos a um conjunto em Go lida automaticamente com a unicidade, fornecendo um desempenho de busca rápido para testes de associação.
Folha de consulta
Para adicionar elementos a um set em Go (implementado como map[string]struct{}), atribua uma struct vazia a uma nova chave:
colors["yellow"] = struct{}{}A sintaxe struct{}{} cria um literal de struct vazia. O primeiro struct{} especifica o tipo, e o segundo {} o inicializa. Esta é a forma padrão de adicionar elementos a um set em Go.
Experimente você mesmo
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Ler a entrada
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// Converter a string de contagem para inteiro (apenas para referência - não usada no loop)
_, _ = strconv.Atoi(countStr)
// Inicializar o conjunto de habilidades com habilidades iniciais
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// Dividir a string de habilidades em habilidades individuais
skills := strings.Split(skillsStr, ",")
// TODO: Escreva seu código abaixo
// Processar cada habilidade usando range para iterar sobre TODAS as habilidades na fatia (slice)
// Usar o idioma comma ok: _, exists := skillSet[skill]
// Adicionar novas habilidades usando: skillSet[skill] = struct{}{}
// Exibir os resultados do processamento para cada habilidade
// Calcular e exibir o resumo do progresso usando len(skills)
// Listar todas as habilidades no conjunto completo de habilidades (considere ordenar para uma saída consistente)
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos6Go Idiomático: Conjuntos
O Idioma de Conjuntos em GoCriando um ConjuntoAdicionando a um ConjuntoVerificando a Existência de ElementosRemovendo de um ConjuntoIterando sobre um ConjuntoRecapitulação - Nomes de Usuário Únicos