Карты структур
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 26 из 68.
Карты становятся невероятно мощными, когда вы храните структуры в качестве значений. Этот подход позволяет организовывать сложные структурированные данные, используя осмысленные ключи для удобного поиска и извлечения.
Когда вы используете структуры в качестве значений карты, вы, по сути, создаёте коллекцию, в которой каждому ключу соответствует полная запись данных. Вот как объявить и инициализировать такую карту:
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 для хранения наборов связанных данных, таких как профили пользователей, каталоги товаров или параметры конфигурации, когда нужны и структурированные данные, и быстрый доступ по ключу.
Задание
ЛегкоСоздай систему управления оценками студентов с помощью отображений, в которых в качестве значений используются структуры. Это задание демонстрирует, как организовать сложные данные о студентах с помощью осмысленных ключей для эффективного поиска и получения данных.
Тебе будут предоставлены два входных значения:
- Строка, представляющая количество студентов (например,
"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) — буквенная оценка студента
- Создать отображение, в котором ключами являются имена студентов (строки), а значениями — структуры
Student - Разобрать данные о студентах из второго входного значения:
- Разделить входную строку по запятым, чтобы получить отдельные записи о студентах
- Для каждой записи разделить строку по двоеточиям, чтобы отделить имя, идентификатор и оценку
- Преобразовать строку с идентификатором в целое число
- Создать структуру
Studentи добавить её в отображение, указав имя в качестве ключа
- Вывести всех студентов в алфавитном порядке по имени в формате:
"[name]: ID [id], Grade [grade]" - Вычислить и вывести статистику оценок:
- Подсчитать, сколько студентов получили каждую оценку (A, B, C, D, F)
- Вывести количество для каждой встречающейся оценки в формате:
"Grade [grade]: [count] students" - Вывести оценки в алфавитном порядке (A, B, C, D, F)
- Найти и вывести студента с наибольшим идентификатором в формате:
"Highest ID: [name] ([id])" - Вывести общее количество студентов:
"Total students: [count]"
Используй пакет strconv, чтобы преобразовать строку с идентификатором в целое число, и пакет sort, чтобы отсортировать имена студентов в алфавитном порядке. Это задание демонстрирует, как отображения со структурами в качестве значений позволяют эффективно организовывать коллекции сложных данных и обращаться к ним с помощью осмысленных идентификаторов.
Попробуйте сами
package main
import (
"fmt"
)
func main() {
// Считать входные данные
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: Определить здесь структуру Student
// TODO: Создать map для хранения студентов (имя — ключ, структура Student — значение)
// TODO: Разобрать данные о студентах и заполнить map
// TODO: Вывести всех студентов в алфавитном порядке по имени
// TODO: Вычислить и вывести статистику оценок
// TODO: Найти и вывести студента с наибольшим ID
// TODO: Вывести общее количество студентов
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go