Menu
Coddy logo textTech

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: A

Este 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.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

challenge icon

Desafio

Fácil

Crie 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 é:

  1. Definir uma struct Student com os seguintes campos:
    • ID (int) - o número de ID do aluno
    • Grade (string) - a nota em letra do aluno
  2. Criar um map onde as chaves são nomes de alunos (strings) e os valores são structs Student
  3. 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 Student e adicioná-la ao map com o nome como chave
  4. Exibir todos os alunos em ordem alfabética pelo nome no formato: "[name]: ID [id], Grade [grade]"
  5. 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)
  6. Encontrar e exibir o aluno com o ID mais alto no formato: "Highest ID: [name] ([id])"
  7. 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: A

Este 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
}
quiz iconTeste seus conhecimentos

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