Mapas de Structs
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 26 de 68.
Mapas tornam-se incrivelmente poderosos quando você armazena structs como valores. Este padrão permite que você organize dados complexos e estruturados usando chaves significativas para fácil busca e recuperação.
Quando você usa structs como valores de um mapa, você está essencialmente criando uma coleção onde cada chave aponta para um registro de dados completo. Veja como você declara e inicializa tal mapa:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Você pode acessar e trabalhar com os dados da struct através do mapa, assim como em qualquer outra operação de mapa. Para obter as informações de um aluno, basta usar o nome dele como chave:
alice := students["Alice"]
fmt.Println(alice.ID) // prints: 101
fmt.Println(alice.Grade) // prints: AEste padrão é extremamente comum em aplicações Go para armazenar coleções de dados relacionados, como perfis de usuário, catálogos de produtos ou configurações, onde você precisa tanto de dados estruturados quanto de acesso rápido baseado em chaves.
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 sistema de gerenciamento de notas de alunos usando maps com structs como valores. Este desafio demonstra como organizar dados complexos de alunos usando chaves significativas para busca e recuperação eficientes.
Você receberá duas entradas:
- Uma string representando o número de alunos (ex:
"4") - Uma string contendo os dados dos alunos no formato:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(ex:"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
Sua tarefa é:
- Definir uma struct
Studentcom os seguintes campos:ID(int) - o número de ID do alunoGrade(string) - a nota em letra do aluno
- Criar um map onde as chaves são nomes de alunos (strings) e os valores são structs
Student - Analisar os dados dos alunos da segunda entrada:
- Dividir a entrada por vírgulas para obter as entradas individuais dos alunos
- Para cada entrada, dividir por dois-pontos para separar nome, ID e nota
- Converter a string do ID para um inteiro
- Criar uma struct
Studente adicioná-la ao map com o nome como chave
- Exibir todos os alunos em ordem alfabética pelo nome no formato:
"[name]: ID [id], Grade [grade]" - Calcular e exibir estatísticas de notas:
- Contar quantos alunos têm cada nota (A, B, C, D, F)
- Exibir a contagem para cada nota que aparece no formato:
"Grade [grade]: [count] students" - Exibir as notas em ordem alfabética (A, B, C, D, F)
- Encontrar e exibir o aluno com o ID mais alto no formato:
"Highest ID: [name] ([id])" - Exibir o número total de alunos:
"Total students: [count]"
Use o pacote strconv para converter a string do ID em um inteiro, e o pacote sort para ordenar os nomes dos alunos alfabeticamente. Este desafio demonstra como maps com valores de struct fornecem uma maneira eficiente de organizar e acessar coleções de dados complexas usando identificadores significativos.
Folha de consulta
Maps podem armazenar structs como valores, criando coleções onde cada chave aponta para um registro de dados completo:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Acesse os dados da struct através do map usando a chave:
alice := students["Alice"]
fmt.Println(alice.ID) // imprime: 101
fmt.Println(alice.Grade) // imprime: AEste padrão é comumente usado para armazenar coleções de dados relacionados, como perfis de usuário, catálogos de produtos ou configurações, onde você precisa de dados estruturados e acesso rápido baseado em chaves.
Experimente você mesmo
package main
import (
"fmt"
)
func main() {
// Ler entrada
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: Definir a struct Student aqui
// TODO: Criar um mapa para armazenar alunos (nome como chave, struct Student como valor)
// TODO: Analisar os dados dos alunos e preencher o mapa
// TODO: Exibir todos os alunos em ordem alfabética por nome
// TODO: Calcular e exibir estatísticas de notas
// TODO: Encontrar e exibir o aluno com o ID mais alto
// TODO: Exibir o número total de alunos
}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