Menu
Coddy logo textTech

Анонимные структуры

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 15 из 107.

Анонимная структура — это структура без именованного типа. Вы определяете её структуру и создаете экземпляр за один шаг, без использования ключевого слова type.

person := struct {
    Name string
    Age  int
}{
    Name: "Alice",
    Age:  30,
}

Это создает значение структуры напрямую без объявления переиспользуемого типа. Анонимные структуры полезны, когда вам нужна быстрая, одноразовая структура данных, которая не будет использоваться в других частях вашего кода.

Типичный сценарий использования — это группировка связанных данных для одной функции или теста.

config := struct {
    Host string
    Port int
}{
    Host: "localhost",
    Port: 8080,
}
fmt.Println(config.Host) // localhost

Анонимные структуры также популярны в табличных тестах, где каждый тестовый случай имеет уникальные поля.

tests := []struct {
    input    int
    expected int
}{
    {1, 2},
    {5, 10},
}

Поскольку анонимные структуры не имеют имени типа, вы не можете определять для них методы или повторно использовать этот тип в других местах. Используйте их для временной локальной группировки данных. Для всего, на что вы будете ссылаться несколько раз, вместо этого определите именованный тип структуры.

challenge icon

Задание

Легко

Давайте создадим простую систему конфигурации, которая демонстрирует преимущества анонимных структур — для разовой группировки данных, не требующей многократного использования типа.

Вы организуете свой код в двух файлах:

  • config.go: Создайте функцию с именем GetServerConfig, которая принимает имя сервера (string), порт (int) и режим отладки (bool) в качестве параметров. Эта функция должна возвращать анонимную структуру, содержащую эти три значения в виде полей: Name, Port и Debug. Поскольку эта конфигурация используется только в одном месте, нет необходимости определять для нее именованный тип.
  • main.go: Считайте значения конфигурации сервера из входных данных, вызовите функцию GetServerConfig и выведите детали конфигурации.

Будут предоставлены следующие входные данные:

  • Строка 1: Имя сервера
  • Строка 2: Номер порта
  • Строка 3: Режим отладки (true или false)

Формат вывода:

Server: [Name]
Port: [Port]
Debug: [Debug]

Например, для входных данных api-server, 8080 и true, ваш вывод должен быть:

Server: api-server
Port: 8080
Debug: true

Обратите внимание, как анонимная структура позволяет возвращать сгруппированные данные, не загромождая кодовую базу типом, который используется всего один раз.

Шпаргалка

Анонимная структура — это структура без именованного типа, которая определяется и инициализируется за один шаг без использования ключевого слова type:

person := struct {
    Name string
    Age  int
}{
    Name: "Alice",
    Age:  30,
}

Анонимные структуры полезны для одноразовых структур данных, которые не будут повторно использоваться в других частях вашего кода.

Типичные варианты использования включают группировку связанных данных для одной функции:

config := struct {
    Host string
    Port int
}{
    Host: "localhost",
    Port: 8080,
}
fmt.Println(config.Host) // localhost

А также табличные тесты:

tests := []struct {
    input    int
    expected int
}{
    {1, 2},
    {5, 10},
}

Анонимные структуры не могут иметь определенных для них методов и не могут быть повторно использованы как тип. Используйте их для временной локальной группировки данных. Для типов, на которые ссылаются несколько раз, вместо этого определите именованную структуру.

Функции могут возвращать анонимные структуры:

func GetConfig() struct {
    Name string
    Port int
} {
    return struct {
        Name string
        Port int
    }{
        Name: "server",
        Port: 8080,
    }
}

Попробуйте сами

package main

import (
	"fmt"
)

func main() {
	// Считать входные значения
	var name string
	var port int
	var debug bool

	fmt.Scanln(&name)
	fmt.Scanln(&port)
	fmt.Scanln(&debug)

	// TODO: Вызвать GetServerConfig с входными значениями
	// и сохранить возвращенную анонимную структуру

	// TODO: Вывести конфигурацию в требуемом формате:
	// Server: [Name]
	// Port: [Port]
	// Debug: [Debug]
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование