Структури в Golang

Структури в Golang є одними з найбільш використовуваних і способом створення типів, визначених користувачем.

У цьому я розповім про основи структур і про те, як їх використовувати у ваших програмах go, на кількох прикладах.

Давайте розпочнемо!

вступ

А структура це сукупність кількох полів даних із визначеними типами даних, згрупованими разом. Вони корисні для групування даних разом для формування спеціальних записів. Структура складається з вбудованих і визначених користувачем типів (структура сама по собі є типом, визначеним користувачем).

Структури в Golang є змінними, тобто їх можна змінювати протягом усієї програми.

Структури допомагають покращити загальну якість коду, дозволяючи нам створювати та передавати складні структури даних між кількома модулями. Уявіть, що передаєте 10 параметрів у функцію, ви скоро втечете від коду. Саме тому структури корисні, тепер замість 10 параметрів ви просто передаєте одну структуру цій функції.

Структура оголошується за допомогою двох ключових слів – типу і структур. Його загортають у фігурні дужки (подібно до класів у java), які містять набір полів із визначеним типом та ідентифікатором (назва). Ми обговоримо деталі реалізації в наступному розділі.

Якщо ви маєте досвід об’єктно-орієнтованого програмування (ООП), ви можете розглядати struct як клас, але без успадкування.

Оголошення структур

Тепер, коли ви розумієте, що таке структура і для чого вона використовується, настав час навчитися оголошувати структури. Основний скелет структури виглядає так:

type name_of_struct struct { 
     field1 data_type_field1 
     field2 data_type_field2 
 }

Тут type і struct є ключовими словами, тоді як struct містить кілька полів із визначеним типом даних.

  Як змусити Siri читати вам статті на вашому Mac

Давайте подивимося на приклад –

package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	var user User
	fmt.Println(user)
}

Тут ми визначаємо структуру User, яка складається з полів string, int і float32. У main() ми оголошуємо нашу структуру як користувач і друкуємо її! На виході ми отримуємо нульове/порожнє значення структури, оскільки ми її ще не ініціалізували! The нульове значення в основному нульові значення кожного поля.

{ 0 0}

Ініціалізація структур

У попередньому розділі ми навчилися оголошувати структури. Тепер ми хочемо ініціалізувати або призначити їм значення. Перегляньте код нижче, щоб дізнатися, як ми це робимо –

package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	// With field names
	user1 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	
	// Without field names
	user2 := User{"Nidhi", 21, 1000.0}
	
	fmt.Println(user1)
	fmt.Println(user2)
}

Сам код пояснює, як ми ініціалізуємо дві структури з іменами полів і без них. Тут результатом буде –

{Mohit 24 100}
 {Nidhi 21 1000}

У наведеному вище випадку, якщо одне з полів не ініціалізовано, тоді це поле за замовчуванням має нульове значення.

user1 := User{
	name:        "Mohit",
	age:         24,
}

 // Output - { Mohit 24 0.0 }

Існує ще один спосіб створення структур за допомогою нового ключового слова. У наступному розділі ми розглянемо, як ним користуватися.

Доступ до полів структури

Тепер ми знаємо, як створювати та ініціалізувати структури, давайте подивимося, як отримати доступ до полів структури. Для цього Golang надає нам оператор крапки. Продовжуючи попередній приклад, давайте отримаємо доступ до полів імені та віку та роздрукуємо їх.

package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	// With field names
	user := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}

	fmt.Println(user.name)
	fmt.Println(user.age)
	fmt.Println(user.bankBalance)
}

Тут ми використовуємо struct_name.field_name для доступу до полів у структурі. Результатом наведеного вище коду буде –

Mohit
 24
 100

Як згадувалося раніше, ми можемо створювати структури за допомогою нового ключового слова. Давайте подивимося, як –

user := new(User)
 user.name = "Mohit"
 user.age = 24
 user.bankBalance = 100.0

 fmt.Println(user)

 // Output - &{Mohit 24 100}

Ключове слово new повертає вказівник на ініціалізовану структуру. У Golang вам не потрібно явно розіменовувати вказівник, але fmt.Println(*user) призведе до того самого результату.

  Як швидко відкрити сторінку налаштувань за допомогою ярликів на iPhone та iPad

Вкладені структури

Структури в golang також можуть містити інші типи, визначені користувачем. Отже, структура може містити інші вкладені структури.

package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
	roleDetails RoleDetails
}

type RoleDetails struct {
	position string
	team     string
}

func main() {
	roleDetailForMohit := RoleDetails{
		position: "Software Engineer",
		team:     "Transport",
	}
	user := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
		roleDetails: roleDetailForMohit,
	}

	fmt.Println(user)
}

У наведеному вище коді ми маємо структуру RoleDetails як частину структури User. Вихід буде –

{Mohit 24 100 {Software Engineer Transport}}

Якщо ви хочете отримати доступ до roleDetails, ви можете зробити це за допомогою того самого оператора крапки –

user.roleDetails.position

Структурна рівність

Дві структури є рівними, якщо кожне з полів, які вони мають, однакове (як вбудоване, так і визначене користувачем), але не всі типи даних можна порівняти. (карта не порівнюється безпосередньо). Давайте розглянемо приклад, щоб продемонструвати рівність.

package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	user1 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	user2 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	user3 := User{
		name:        "Nidhi",
		age:         21,
		bankBalance: 1000.0,
	}

	if user1 == user2 {
		fmt.Println("user1 and user2 are equal")
	} else {
		fmt.Println("user1 and user2 are not equal")
	}

	if user1 == user3 {
		fmt.Println("user1 and user3 are equal")
	} else {
		fmt.Println("user1 and user3 are not equal")
	}
}

Порожні та нульові структури рівноцінні. Порядок полів не має значення, в основному кожне поле має збігатися для рівності. Вихід для коду вище буде –

user1 and user2 are equal
user1 and user3 are not equal

Висновок

Чудово!

  Як встановити та використовувати програму Microsoft Teams для iPad

Тепер ви готові до використання структур у golang. Ми розглянули всі основи, такі як оголошення, ініціалізація та доступ до структурних полів. Ми також розглянули, як порівняти дві структури, і навіть реалізували вкладену структуру. Ось деякі ресурси, щоб дізнатися більше про структури –

Ще багато чого потрібно дізнатися про структури, але поки що це хороший початок. Сподіваюся, ви дізналися щось нове!

Продовжуйте досліджувати. Продовжуйте вчитися!