Инициализация структур
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 9 из 107.
Go предоставляет несколько способов инициализации структур, каждый из которых полезен в различных ситуациях.
Инициализация именованных полей
type Person struct {
Name string
Age int
City string
}
p1 := Person{
Name: "Alice",
Age: 25,
City: "New York",
}Позиционная инициализация (порядок должен соответствовать объявлению полей)
p2 := Person{"Bob", 30, "London"}Инициализация нулевыми значениями (все поля получают значения по умолчанию)
p3 := Person{}
// Name: "", Age: 0, City: ""
Частичная инициализация (неустановленные поля получают нулевые значения)
p4 := Person{Name: "Charlie"}
// Name: "Charlie", Age: 0, City: ""
Указатель на структуру с использованием &
p5 := &Person{
Name: "Diana",
Age: 28,
City: "Paris",
}
fmt.Println(p5.Name) // DianaИспользование var с последующим присвоением значений полям
var p6 Person
p6.Name = "Eve"
p6.Age = 22Инициализация именованных полей — самый распространенный и читаемый подход. Используйте &, когда вам нужен указатель на структуру.
Задание
СреднеСоздайте три объекта Player, используя различные методы инициализации:
- player1: Инициализация именованных полей с использованием входных значений
- player2: Инициализация именованных полей со значениями Name: "Guest", Class: "Novice", HitPoints: 50
- player3: Используйте объявление
var, а затем присвойте значение каждому полю по отдельности
Шпаргалка
Go предоставляет несколько способов инициализации структур:
Инициализация с именованными полями (наиболее распространенная и читаемая):
p1 := Person{
Name: "Alice",
Age: 25,
City: "New York",
}Позиционная инициализация (порядок должен соответствовать объявлению полей):
p2 := Person{"Bob", 30, "London"}Инициализация со значениями по умолчанию (все поля получают значения по умолчанию):
p3 := Person{}
// Name: "", Age: 0, City: ""Частичная инициализация (неуказанные поля получают значения по умолчанию):
p4 := Person{Name: "Charlie"}
// Name: "Charlie", Age: 0, City: ""Указатель на структуру с использованием &:
p5 := &Person{
Name: "Diana",
Age: 28,
}
fmt.Println(p5.Name) // DianaИспользование var с последующим присваиванием значений полям:
var p6 Person
p6.Name = "Eve"
p6.Age = 22Попробуйте сами
package main
import "fmt"
func main() {
var name, class string
var hp int
fmt.Scan(&name, &class, &hp)
// TODO: Создайте player1, используя инициализацию именованных полей с входными значениями
// TODO: Создайте player2, используя инициализацию именованных полей:
// Name: "Guest", Class: "Novice", HitPoints: 50
// TODO: Создайте player3, используя объявление var, затем присвойте значения полям:
// Name: "Hero", Class: "Knight", HitPoints: 200
fmt.Printf("Player 1: %s (%s) - HP: %d\n", player1.Name, player1.Class, player1.HitPoints)
fmt.Printf("Player 2: %s (%s) - HP: %d\n", player2.Name, player2.Class, player2.HitPoints)
fmt.Printf("Player 3: %s (%s) - HP: %d\n", player3.Name, player3.Class, player3.HitPoints)
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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