Criando um Conjunto
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 32 de 68.
Agora que você entende o conceito por trás do idioma de conjunto do Go, é hora de colocá-lo em prática criando seu primeiro conjunto. O processo é direto e segue os mesmos padrões que você já aprendeu com maps.
Para criar um conjunto (set) em Go, você declara uma variável usando o padrão map[T]struct{}, onde T é o tipo de elementos que você deseja armazenar. Veja como criar um conjunto para armazenar nomes de cores únicos:
colors := make(map[string]struct{})Você também pode inicializar um set com alguns valores iniciais usando a sintaxe de literal de mapa:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Observe como cada valor é um literal de struct vazio {}. Isso cria o valor zero de struct{}, que não ocupa espaço na memória, permitindo que a chave exista no mapa.
A beleza desta abordagem é que ela aproveita a infraestrutura de maps existente do Go, ao mesmo tempo que fornece semântica de conjunto (set) real — cada nome de cor pode aparecer apenas uma vez, e você obtém tempos de busca rápidos, assim como com maps regulares.
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ácilCrie um rastreador de preferência de linguagem de programação que demonstre o idioma de conjunto (set) do Go para armazenar itens exclusivos. Este desafio mostra como usar o padrão map[string]struct{} para rastrear linguagens de programação sem duplicatas.
Você receberá duas entradas:
- Uma string representando o número de linguagens a serem processadas (ex:
"6") - Uma string contendo linguagens de programação separadas por vírgulas (ex:
"Go,Python,JavaScript,Go,Java,Python,C++,JavaScript")
Sua tarefa é:
- Criar um conjunto usando o idioma do Go
map[string]struct{}para armazenar linguagens de programação exclusivas - Analisar a string de entrada dividindo-a por vírgulas para obter nomes de linguagens individuais
- Adicionar cada linguagem ao seu conjunto usando o literal de struct vazia
{}como valor - Exibir os resultados do processamento imprimindo cada linguagem conforme ela é encontrada:
- Se a linguagem for nova no conjunto:
"Added: [language]" - Se a linguagem já existir no conjunto:
"Already exists: [language]"
- Se a linguagem for nova no conjunto:
- Após processar todas as linguagens, exibir um resumo:
"Total languages processed: [total_count]""Unique languages: [unique_count]"
- Finalmente, listar todas as linguagens exclusivas no conjunto:
- Cabeçalho:
"Programming languages in set:" - Cada linguagem em uma linha separada:
"- [language]"
- Cabeçalho:
Use o pacote strings para dividir a string de entrada e o pacote strconv para converter a string de contagem em um número inteiro. Para verificar se uma linguagem já existe no conjunto antes de adicioná-la, use o idioma comma ok: _, exists := languageSet[language]. Este desafio demonstra como o idioma de conjunto do Go fornece uma maneira eficiente de rastrear itens exclusivos e evitar duplicatas em seus dados.
Folha de consulta
Para criar um conjunto (set) em Go, use o padrão map[T]struct{} onde T é o tipo do elemento:
colors := make(map[string]struct{})Você também pode inicializar um conjunto com valores iniciais usando a sintaxe de literal de mapa:
colors := map[string]struct{}{
"red": {},
"blue": {},
"green": {},
}Cada valor é um literal de struct vazia {} que cria o valor zero de struct{} e não ocupa espaço na memória, permitindo que a chave exista no mapa.
Para verificar se um elemento existe no conjunto, use o idioma "comma ok":
_, exists := languageSet[language]Experimente você mesmo
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// Ler a entrada
var countStr string
var languagesStr string
fmt.Scanln(&countStr)
fmt.Scanln(&languagesStr)
// Converter a string de contagem para inteiro (não necessário para este desafio)
_, _ = strconv.Atoi(countStr)
// Dividir a string de linguagens por vírgulas
languages := strings.Split(languagesStr, ",")
// Criar um conjunto usando o idioma map[string]struct{}
languageSet := make(map[string]struct{})
// TODO: Escreva seu código abaixo
// Processar cada linguagem e verificar se ela existe no conjunto
// Usar o idioma comma ok: _, exists := languageSet[language]
// Imprimir "Added: [language]" ou "Already exists: [language]"
// Adicionar linguagens ao conjunto usando o literal de struct vazia {}
// Imprimir informações de resumo
// Imprimir o total de linguagens processadas e a contagem de linguagens únicas
// Imprimir todas as linguagens únicas no conjunto
fmt.Println("Programming languages in set:")
// Converter o mapa para slice e ordenar para uma saída consistente
// Listar cada linguagem com o formato "- [language]"
}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 Comportamentos