Зачем нужны структуры в Go?
В любом проекте требуется работа с данными, описывающими объекты. В Go для этого используются структуры. Они аналогичны классам в других языках программирования, позволяя создавать объекты, реализовывать наследование и другие концепции объектно-ориентированного программирования (ООП) – наследование, инкапсуляция и полиморфизм. Структуры необходимы при создании различных сущностей, например, пользователей, новостных категорий или элементов базы данных.
Создание структуры
Структура определяется вне функции, начиная с ключевого слова type, за которым следует имя структуры (рекомендуется использовать заглавные буквы для экспорта) и ключевое слово struct. Внутри фигурных скобок перечисляются поля структуры (переменные).
Например, структура User с полями name (строка), age (беззнаковое 16-битное целое число), balance (16-битное целое число), rating (число с плавающей точкой двойной точности) и happiness (число с плавающей точкой двойной точности):
type User struct {
name string
age uint16
balance int16
rating float64
happiness float64
}
Создание объектов
Существует несколько способов создания объектов структуры:
- Инициализация с помощью var:
var bob User
Этот способ используется реже, чем другие.
- Инициализация с указанием значений:
bob := User{
name: "Bob",
age: 25,
balance: -50,
rating: 4.2,
happiness: 0.8,
}
- Инициализация без указания ключей:
bob := User{"Bob", 25, -50, 4.2, 0.8}
Второй и третий способы эквивалентны.
Работа со структурой и вывод данных
Пример создания объекта bob и вывода его имени:
fmt.Println("User name is ", bob.name)
Изменение имени:
bob.name = "Alex"
Создание методов
Метод для структуры определяется с помощью ключевого слова func. Первый параметр метода – это указатель (*) или значение структуры, через которую вызывается метод.
Пример метода getAllInfo:
func (u User) getAllInfo() string {
return fmt.Sprintf("User name is %s, he is %d and he has %d", u.name, u.age, u.balance) // Исправлено: u.money на u.balance
}
Вызов метода:
fmt.Println(bob.getAllInfo())
Изменение значений через методы
Метод для изменения имени с использованием указателя на структуру (*User):
func (u *User) setNewName(newName string) {
u.name = newName
}
Использование указателя гарантирует изменение значения в исходном объекте.
Вызов метода:
bob.setNewName("Alex")
Передача объектов
При работе с малыми структурами допустима передача по значению. Для больших структур рекомендуется передача по ссылке (*) для повышения эффективности.
В этом уроке были рассмотрены структуры в Go – эффективный инструмент для работы с данными в программах.