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ê criou um conjunto, o próximo passo é aprender a adicionar elementos a ele. Como um conjunto em Go é, na verdade, um map internamente, adicionar um elemento a um conjunto é idêntico a adicionar uma chave a um map.
Para adicionar um elemento ao seu conjunto, basta atribuir o valor de struct vazio 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. Essa é a maneira padrão de adicionar elementos a um conjunto em Go.
A vantagem dessa abordagem é que, se você tentar adicionar o mesmo elemento novamente, ele simplesmente sobrescreverá a entrada existente, mantendo a propriedade de exclusividade do conjunto.
Observe que struct{}{} é a única sintaxe válida para essa 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 simples, aproveitando a implementação eficiente de mapas do Go e, ao mesmo tempo, oferecendo um comportamento genuíno de conjunto para rastrear itens exclusivos.
Desafio
FácilCrie um sistema de acompanhamento de habilidades que gerencie as competências técnicas de um desenvolvedor usando o idiom de conjunto do Go. Este desafio demonstra como adicionar novas habilidades a um conjunto, evitando duplicatas e acompanhando o progresso do aprendizado.
Você receberá duas entradas:
- Uma string que representa o número esperado de habilidades (por exemplo,
"5") — isso serve apenas como referência - Uma string contendo habilidades separadas por vírgulas (por exemplo,
"Go,Docker,Kubernetes,Go,React,Docker,Python")
Sua tarefa é:
- Criar um conjunto usando o idiom 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 nas vírgulas para obter os nomes individuais das habilidades
- Processar TODAS as habilidades da string separada por vírgulas (percorrer todo o slice, sem usar o parâmetro de contagem)
- Para cada habilidade da entrada, adicioná-la ao conjunto usando
struct{}{}como 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:
- Depois de 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]"
- Por fim, 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 percorrer todas as habilidades no slice, não o parâmetro de contagem. A contagem é fornecida como 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 idiom comma ok: _, exists := skillSet[skill]. Este desafio demonstra como adicionar elementos a um conjunto do Go lida automaticamente com a unicidade, além de oferecer um desempenho rápido de consulta para testar a associação.
Experimente você mesmo
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Ler entrada
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// Converter a string count para inteiro (apenas para referência - não usado 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 no 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)
// List all skills in the complete skill set (consider sorting for consistent output)
}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 ÚnicosPratique por conta própria: Compilador de Go online