Анонимные структуры
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy. Урок 15 из 107.
anonymous struct — это структура без именованного типа. Вы определяете её структуру и создаёте экземпляр за один шаг, не используя ключевое слово type.
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}Это напрямую создаёт значение struct без объявления повторно используемого типа. Anonymous struct полезны, когда вам нужна быстрая одноразовая структура данных, которая не будет использоваться где-либо ещё в вашем коде.
Распространённый вариант использования — группировка связанных данных для одной функции или теста.
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},
}Поскольку у анонимных структур нет имени типа, вы не можете определять для них методы или повторно использовать этот тип в другом месте. Используйте их для временной локальной группировки данных. Для всего, на что вы будете ссылаться несколько раз, вместо этого определите именованный тип структуры.
Задание
ЛегкоСоздадим быструю систему configuration, которая демонстрирует, когда anonymous struct особенно полезна — для разового группирования данных, которому не нужен повторно используемый тип.
Ты организуешь код в двух файлах:
config.go: создай функцию с именемGetServerConfig, которая принимает имя server (string), порт (int) и режим debug (bool) в качестве parameters. Эта функция должна возвращать anonymous struct, содержащую эти три значения в качестве полей:Name,PortиDebug. Поскольку эта configuration используется только в одном месте, нет необходимости определять для неё именованный тип.main.go: считай значения configuration server из input, вызови свою функциюGetServerConfigи выведи сведения о configuration.
Будут предоставлены следующие входные данные:
- Строка 1: имя Server
- Строка 2: номер Port
- Строка 3: режим Debug (
trueилиfalse)
Формат вывода:
Server: [Name]
Port: [Port]
Debug: [Debug]Например, если даны api-server, 8080 и true, твой вывод должен быть таким:
Server: api-server
Port: 8080
Debug: trueОбрати внимание, как anonymous struct позволяет возвращать сгруппированные данные, не загромождая кодовую базу типом, который используется только один раз.
Попробуйте сами
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]
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП в Go
Внешние файлыРабочее пространство и модули GoПакеты и импортыЭкспортируемые и неэкспортируемые именаВведение в ООП в GoСтруктуры как классыОпределение методов структурПолучатели-указатели и получатели-значенияИнициализация структурФункции-конструкторыИтоги — Простой калькулятор4Интерфейсы
Введение в интерфейсыНеявная реализацияИнтерфейс как контрактПустой интерфейс (any)Утверждение типаПереключатель типовКомпозиция интерфейсовИнтерфейсы Stringer и ErrorПовторение: Калькулятор фигур7Инкапсуляция
Экспортируемые и неэкспортируемые поляИнкапсуляция на уровне пакетовГеттеры и сеттерыСокрытие информации в GoИтоги — Записи о студентах10Обобщения (Generics) (Go 1.18+)
Введение в GenericsПараметры типовОграничения типовОбобщенные структурыОбходной путь для обобщенных методовИтоги — Обобщенная коллекция13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн Abstract FactoryПаттерн ObserverПаттерн Strategy2Глубокое погружение в типы и структуры
Базовые и составные типыОпределение пользовательских типовТеги структурАнонимные структурыВложенные структурыНулевые значения и значения по умолчаниюПовторение — Контактная книга5Композиция вместо наследования
Почему в Go нет наследованияОсновы встраивания структурПродвижение методовВстраивание нескольких структурВстраивание против агрегацииЗатенение встроенных методовИтоги — Иерархия сотрудников8Обработка ошибок и ООП
Интерфейс errorПользовательские типы ошибокОбертывание ошибок (fmt.Errorf)Sentinel-ошибкиerrors.Is() и errors.As()Panic, Defer и RecoverИтоги — Парсер файлов11Стандартная библиотека и ООП
io.Reader и io.Writersort.InterfaceИнтерфейс fmt.Stringerencoding/json со структурамиИнтерфейс http.HandlerПовторение: модели REST API14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикMiddleware как Декоратор3Указатели и память
Основы указателей в GoУказатели на структурыПередача по значению и по ссылкеФункция new()Сборка мусора в GoПовторение: Конструктор связного списка6Полиморфизм в Go
Полиморфизм через интерфейсыУтиная типизация в GoПравила реализации интерфейсовПолиморфные коллекцииВнедрение зависимостейИтоги — Обработчик платежей9Конкурентность и ООП
Основы горутинКаналы и взаимодействиеБуферизованные и небуферизованные каналыОператор selectsync.Mutex и sync.RWMutexsync.WaitGroupПроектирование потокобезопасных структурПовторение — Worker PoolПотренируйтесь самостоятельно: Онлайн-компилятор Go