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 por meio 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) // imprime: 101
fmt.Println(alice.Grade) // imprime: 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.
Desafio
FácilCrie um sistema de gerenciamento de notas de alunos usando mapas com structs como valores. Este desafio demonstra como organizar dados complexos de alunos usando chaves significativas para uma consulta e recuperação eficientes.
Você receberá duas entradas:
- Uma string que representa o número de alunos (por exemplo,
"4") - Uma string contendo os dados dos alunos no formato:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(por exemplo,"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 identificação do alunoGrade(string) - a nota do aluno representada por uma letra
- Criar um mapa em que as chaves sejam os nomes dos alunos (strings) e os valores sejam structs
Student - Analisar os dados dos alunos a partir 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 o nome, o ID e a nota
- Converter a string do ID em um número inteiro
- Criar uma struct
Studente adicioná-la ao mapa, usando o nome como chave
- Exibir todos os alunos em ordem alfabética pelo nome no formato:
"[name]: ID [id], Grade [grade]" - Calcular e exibir as estatísticas das notas:
- Contar quantos alunos têm cada nota (A, B, C, D, F)
- Exibir a contagem de cada nota que aparecer 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 maior ID 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 número inteiro e o pacote sort para ordenar os nomes dos alunos alfabeticamente. Este desafio demonstra como mapas com valores struct oferecem uma maneira eficiente de organizar e acessar coleções de dados complexas usando identificadores significativos.
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 ComportamentosPratique por conta própria: Compilador de Go online