Структури|Structs
#
// Структури в Go - це колекції полів з визначеним типом.
// Надзвичайну корисність структур можна оцінити не тільки для
// групування даних, а й тому що вони служать основним рушієм мови
// що орієнтується на данні - на структури.
package main
import "fmt"
// Структура `person` має поля для імені (`name`) та віку (`age`).
type person struct {
name string
age int
}
// `newPerson` створює нову персону з заданим ім'ям.
func newPerson(name string) *person {
// Можна безпечно повертати вказівник на локальну змінну
// і ця змінна переживе свій скоуп.
p := person{name: name}
p.age = 42
return &p
}
func main() {
// Дозволяється пропускати поля при ініціалізації структури.
fmt.Println(person{"Bob", 20})
// Дозволяється іменувати поля при ініціалізації структури.
fmt.Println(person{name: "Alice", age: 30})
// Omitted fields will be zero-valued.
fmt.Println(person{name: "Fred"})
// Префікс `&` поверне вказівник на структуру.
fmt.Println(&person{name: "Ann", age: 40})
// Приховувати процес створення стуктури іншою функцією - це
// ідіоматичний підхід у Go.
fmt.Println(newPerson("Jon"))
// Доступ до полів надається через синтаксис крапки `.`
s := person{name: "Sean", age: 50}
fmt.Println(s.name)
// Дозволяється використовувати крапки з вказівниками структур,
// вказівники, в такому разі, автоматично розіменовуються.
sp := &s
fmt.Println(sp.age)
// Дані у структурі можна змінювати (тобто вони `mutable`,
// такі що дозволяється змінювати).
sp.age = 51
fmt.Println(sp.age)
// Якщо структура використовувається лише короткостроково, ми
// не даємо їй імені. Значення може містити анонімну структуру,
// ця тезніка часто використовуєтся для
// [табличних тестів](testing-and-benchmarking).
dog := struct {
name string
isGood bool
}{
"Rex",
true,
}
fmt.Println(dog)
}
$ go run structs.go
{Bob 20}
{Alice 30}
{Fred 0}
&{Ann 40}
&{Jon 42}
Sean
50
51
{Rex true}