У Go struct - це послідовність іменованих елементів, які називаються полями; кожне поле має назву та тип.
Назва поля має бути унікальною в межах структури.
Структури можна порівняти з класами в парадигмі обʼєктно-орієнтованого програмування.
Нову структуру створюють за допомогою ключових слів type та struct, явно вказуючи назви й типи полів.
Наприклад, ось ми визначаємо структуру Shape, яка зберігає назву фігури та її розмір:
type Shape struct {
name string
size int
}
Назви полів у структурах підпорядковуються конвенції Go: поля, назва яких починається з малої літери, видимі лише коду в тому самому пакеті, а ті, чия назва починається з великої літери, видимі і в інших пакетах.
Коли структуру визначено, потрібно створити новий екземпляр, вказавши поля за їхніми назвами в будь-якому порядку:
s := Shape {
name: "Square",
size: 25,
}
Щоб прочитати або змінити поля екземпляра, використовуємо запис через крапку .:
// Update the name and the size
s.name = "Circle"
s.size = 35
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 35
Поля, яким не присвоєно початкового значення, отримають нульове значення. Наприклад:
s := Shape{name: "Circle"}
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 0
Екземпляр структури можна створити й без назв полів, якщо визначити поля у порядку їх оголошення:
s := Shape {
"Oval",
20,
}
Однак такий синтаксис вважається крихким кодом, бо він може зламатися, коли додають поле, особливо якщо нове поле має інший тип.
У наступному прикладі ми додаємо до Shape додаткове поле:
type Shape struct {
name string
description string // new field 'description' added
size int
}
s := Shape{
"Circle",
20,
}
// Since the second field of the struct is now a string and not an int,
// the compiler will throw an error when compiling the program:
// Output: cannot use 20 (type untyped int) as type string in field value
// Output: too few values in Shape{...}
Іноді буває зручно мати функції, які допомагають створювати екземпляри структур.
За конвенцією такі функції зазвичай називають New або дають їм назви, що починаються з New, але оскільки це просто звичайні функції, їм можна дати будь-яку назву.
Вони можуть нагадувати конструктори з інших мов, але в Go це просто звичайні функції.
У наступному прикладі одна з таких функцій New створює новий екземпляр Shape і автоматично задає типове значення для size фігури:
func NewShape(name string) Shape {
return Shape{
name: name,
size: 100, //default-value for size is 100
}
}
NewShape("Triangle")
// => Shape { name: "Triangle", size: 100 }
Використання функцій New має такі переваги:
New часто оголошують у тому самому пакеті, що й структури, які вони ініціалізують, вони можуть ініціалізувати навіть приватні поля структуриЩоб глибше розібратися з цим типом, можна переглянути такі джерела: Go by Example: Structs, A Tour of Go: Structs або Structures in Go (structs)
new
Ще один спосіб створити новий екземпляр структури - скористатися вбудованою функцією new:
s := new(Shape) // s will be of type *Shape (pointer to shape)
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: size: 0
У цьому прикладі new створює екземпляр структури Shape, усі значення якого ініціалізовано нульовими значеннями їхніх типів, і повертає вказівник на нього.
Найчастіше нові екземпляри структур створюють не за допомогою вбудованої функції new.
Краще використовувати літерал структури, власну функцію New або будь-яку іншу функцію з пакета, яка допомагає побудувати структуру.
Вбудовану функцію new варто використовувати для створення нових екземплярів структур лише як останній засіб.