Структуры в Go

Теория: Структуры в срезах и картах

В реальных программах редко обрабатывается одна сущность. Обычно приходится работать с множеством: список заказов, множество пользователей, каталог товаров. Чтобы хранить и организовывать такие данные, в Go есть срезы и карты. А если их элементами становятся структуры, мы получаем естественные и удобные модели.

Срезы

Срез — это упорядоченный список элементов. Он удобен, когда важен порядок или нужно пройтись по всем объектам.

Начнем с простого: список имен пользователей.

users := []string{"Анна", "Борис", "Светлана"}
for i, name := range users {
fmt.Println(i, name)
}

Здесь []string — это срез строк. Мы видим порядок, можем обратиться к элементу по индексу (users[0] даст "Анна") и пройтись по всем в цикле.

Карты

Карта — это набор пар «ключ → значение». Мы используем ее, когда порядок не важен, а быстрый доступ по ключу критичен.

Простейший пример: справочник паролей по логину.

passwords := map[string]string{
"admin": "qwerty123",
"user": "12345",
}

fmt.Println(passwords["admin"]) // выведет qwerty123

Здесь map[string]string — это карта, где ключом выступает логин, а значением — пароль. Доступ по ключу мгновенный, перебор не нужен.

Срезы структур

Теперь усложним задачу. Представим систему заказов и определим структуру Order:

type Order struct {
	ID       int
	Customer string
	Items    []string
	Status   string
}

Создадим срез заказов:

orders := []Order{
	{ID: 101, Customer: "Иван", Items: []string{"Ноутбук", "Мышь"}, Status: "new"},
	{ID: 102, Customer: "Мария", Items: []string{"Телефон"}, Status: "processing"},
}

for _, order := range orders {
	fmt.Printf("Заказ %d для %s, статус: %s\n", order.ID, order.Customer, order.Status)
}

Все данные собраны в единую модель, нет риска рассинхронизации между отдельными срезами.

Карты со структурами

Чтобы быстро находить заказ по ID, используем карту:

ordersMap := map[int]Order{
	101: {ID: 101, Customer: "Иван", Items: []string{"Ноутбук", "Мышь"}, Status: "new"},
	102: {ID: 102, Customer: "Мария", Items: []string{"Телефон"}, Status: "processing"},
}

order := ordersMap[101]
fmt.Println(order.Customer) // Иван

Карта позволяет получать заказ напрямую, без перебора.

Структуры как ключи карт

Иногда сама структура может быть ключом. Например, оценки студентов по имени и возрасту:

type Student struct {
	Name string
	Age int
}

grades := map[Student]float64{
	{Name: "Ольга", Age: 20}: 4.5,
	{Name: "Петр", Age: 22}: 3.9,
}

Важно: ключ не может содержать несравнимые типы — такие как срезы или карты.

Комбинации

На практике часто встречаются вложенные варианты:

  • срез внутри структуры, которая хранится в карте;
  • карта внутри структуры, которая лежит в срезе;
  • карта, где значением является срез структур;
  • срез структур, внутри которых есть срезы.

Когда использовать

  • Срез — когда нужен порядок и обход всех элементов.
  • Карта — когда важен быстрый доступ по ключу и порядок не имеет значения.

На практике оба механизма комбинируются: срез для отображения и сортировки, карта для поиска и проверки существования.

И только когда мы соединяем структуры со срезами и картами, мы получаем мощные и гибкие модели данных. Например, список всех заказов (срез структур) или база клиентов, где каждому email соответствует карточка клиента (карта структур).

Рекомендуемые программы

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845