Треки
/
Go
Go
/
Салабус
/
Структури
Ст

Структури у Go

1 вправа

Про концепцію Структури

У 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 або дають їм назви, що починаються з 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, усі значення якого ініціалізовано нульовими значеннями їхніх типів, і повертає вказівник на нього.

Note

Найчастіше нові екземпляри структур створюють не за допомогою вбудованої функції new. Краще використовувати літерал структури, власну функцію New або будь-яку іншу функцію з пакета, яка допомагає побудувати структуру. Вбудовану функцію new варто використовувати для створення нових екземплярів структур лише як останній засіб.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Структури