Карты структур
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 26 из 68.
Карты становятся невероятно мощными, когда вы храните структуры в качестве значений. Этот шаблон позволяет организовывать сложные структурированные данные, используя осмысленные ключи для удобного поиска и извлечения.
Когда вы используете структуры в качестве значений карты (map), вы, по сути, создаете коллекцию, где каждый ключ указывает на полную запись данных. Вот как можно объявить и инициализировать такую карту:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Вы можете получать доступ к данным структур и работать с ними через карту точно так же, как и при любой другой операции с картой. Чтобы получить информацию о студенте, вы просто используете его имя в качестве ключа:
alice := students["Alice"]
fmt.Println(alice.ID) // выводит: 101
fmt.Println(alice.Grade) // выводит: AЭтот паттерн чрезвычайно распространен в приложениях на Go для хранения коллекций связанных данных, таких как профили пользователей, каталоги товаров или настройки конфигурации, где требуются как структурированные данные, так и быстрый доступ по ключу.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоСоздайте систему управления оценками студентов, используя карты (maps) со структурами в качестве значений. Эта задача демонстрирует, как организовать сложные данные о студентах, используя осмысленные ключи для эффективного поиска и извлечения.
Вы получите два входных значения:
- Строка, представляющая количество студентов (например,
"4") - Строка, содержащая данные о студентах в формате:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(например,"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
Ваша задача:
- Определить структуру
Studentсо следующими полями:ID(int) — идентификационный номер студентаGrade(string) — буквенная оценка студента
- Создать карту (map), где ключами являются имена студентов (строки), а значениями — структуры
Student - Разобрать данные о студентах из второго входного значения:
- Разделить входную строку по запятым, чтобы получить записи об отдельных студентах
- Для каждой записи разделить ее по двоеточиям, чтобы отделить имя, ID и оценку
- Преобразовать строку ID в целое число
- Создать структуру
Studentи добавить ее в карту, используя имя в качестве ключа
- Вывести всех студентов в алфавитном порядке по имени в формате:
"[name]: ID [id], Grade [grade]" - Рассчитать и вывести статистику по оценкам:
- Подсчитать, сколько студентов имеют каждую оценку (A, B, C, D, F)
- Вывести количество для каждой встретившейся оценки в формате:
"Grade [grade]: [count] students" - Выводить оценки в алфавитном порядке (A, B, C, D, F)
- Найти и вывести студента с самым высоким ID в формате:
"Highest ID: [name] ([id])" - Вывести общее количество студентов:
"Total students: [count]"
Используйте пакет strconv для преобразования строки ID в целое число и пакет sort для сортировки имен студентов по алфавиту. Эта задача демонстрирует, как карты со значениями-структурами обеспечивают эффективный способ организации и доступа к сложным коллекциям данных с использованием осмысленных идентификаторов.
Шпаргалка
Карты могут хранить структуры в качестве значений, создавая коллекции, где каждый ключ указывает на полную запись данных:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Доступ к данным структуры через карту осуществляется с помощью ключа:
alice := students["Alice"]
fmt.Println(alice.ID) // выводит: 101
fmt.Println(alice.Grade) // выводит: AЭтот паттерн обычно используется для хранения коллекций связанных данных, таких как профили пользователей, каталоги товаров или настройки конфигурации, когда вам требуются как структурированные данные, так и быстрый доступ по ключу.
Попробуйте сами
package main
import (
"fmt"
)
func main() {
// Чтение входных данных
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: Определите структуру Student здесь
// TODO: Создайте карту (map) для хранения студентов (имя как ключ, структура Student как значение)
// TODO: Разберите данные о студентах и заполните карту
// TODO: Выведите всех студентов в алфавитном порядке по имени
// TODO: Рассчитайте и выведите статистику оценок
// TODO: Найдите и выведите студента с самым высоким ID
// TODO: Выведите общее количество студентов
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение