Всеохватывающие структуры — изучите Go

Go
Всеохватывающие структуры — изучите Go

Массивы в языке Go могут хранить набор данных одного типа, тогда как структуры могут объединять переменные данные разных типов, и каждая переменная является членом структуры.

Создать и инициализировать структуру

Структура может быть создана с использованием следующего синтаксиса:

type StructName struct{
    field1 fieldType1
    field2 fieldType2
}

Создайте содержащийfirstName,lastName,salaryа такжеfullTimeструктура переменных-членовEmployee.

type Empolyee struct{
	firstName string
	lastName string
	salary int
	fullTime bool
}

Переменные-члены одного типа могут быть размещены в одной строке, поэтому приведенный выше код можно сократить так:

type Empolyee struct{
	firstName,lastName string
	salary int
	fullTime bool
}

Используйте псевдонимы типовEmployeeСоздайте структурную переменнуюross

var ross Empolyee
ross.firstName = "ross"
ross.lastName = "Bingo"
ross.salary = 1000
ross.fullTime = true
fmt.Println(ross)

выход:

{ross Bingo 1000 true}

Приведенный выше код создает переменную структурыross, и присвойте значения каждой переменной-члену. использовать.Доступ к членам структуры.
также можно использоватьбуквальныйСпособ инициализации структуры:

1、方式一
ross := Empolyee{
	"ross",
	"Bingo",
	1000,
	true,
}
输出:{ross Bingo 1000 true}

2、方式二
ross := Empolyee{
	lastName:"Bingo",
	firstName:"ross",
	salary:1000,
}
输出:{ross Bingo 1000 false}

В первом случае имя переменной-члена при инициализации опускается, но значения всех членов должны быть указаны по порядку. Типы всех членов необходимо запоминать и назначать по порядку, что создает дополнительную нагрузку на разработчиков и ухудшает ремонтопригодность кода.Этот метод обычно не используется;
Второй метод рекомендуется, Не заботьтесь о порядке переменных-членов, присваивайте значения членам, которые необходимо инициализировать, а неназначенные члены по умолчанию имеют нулевое значение, соответствующее типу.Уведомление: нельзя смешивать первый и второй методы инициализации

ross := Empolyee{
	firstName:"ross",
	lastName:"Bingo",
	1000,
	fullTime:true,
}

Ошибка компиляции:mixture of field:value and value initializers

Порядок переменных-членов важен для идентичности структуры, если вышеприведенноеfirstName,lastNameпоменять заказ илиfullTime,salaryПоменять порядок, определить другой тип структуры

указатель структуры

При инициализации структуры вы можете объявить указатель на структуру:

ross_pointer := &Empolyee{
	firstName:"ross",
	lastName:"Bingo",
	salary:1000,
	fullTime:true,
}

Приведенный выше код создает указатель наEmpolyeeуказатель на структуруross_pointer. К членам структур можно получить доступ через указатели:

fmt.Println(*ross_pointer)
fmt.Println("firstName:",(*ross_pointer).firstName)
fmt.Println("firstName:",ross_pointer.lastName)

выход:

{ross Bingo 1000 true}
firstName: ross
firstName: Bingo

ross_pointerявляется структурной переменной, поэтому(*ross_pointer).firstNameа такжеross_pointer.lastNameявляются правильными методами доступа.

анонимный член

При определении структуры вы можете указать только тип члена, не указывая имя члена, Go будет автоматически использовать тип члена в качестве имени члена. Члены этой структуры называютсяанонимный член.Тип этого члена структуры должен быть именованным типом или указателем на именованный тип.

type Week struct{
	string
	int
	bool
}
func main() {
	week := Week{"Friday",1000,true}
	fmt.Println(week)
}

Приведенный выше код определяет структуруWeek,имеютstring,intа такжеboolТри переменные-члены, имя переменной совпадает с типом. Этот метод определения можно смешивать с указанным именем элемента, например:

type Empolyee struct{
	firstName,lastName string
	salary int
	bool
}

вложение структуры

Go имеетвложение структурыМеханизм, с помощью которого структура может быть членом структуры другого типа.

type Salary struct {
	basic int
	workovertime int
}

type Empolyee struct{
	firstName,lastName string
	salary Salary
	bool
}

func main() {
	ross := Empolyee{
	    firstName:"Ross",
            lastName:"Bingo",
            bool:true,
            salary:Salary{1000,100},
	}
	fmt.Println(ross.salary.basic);
}

Мы заново определили тип структурыSalary,БудуEmpolyeeТип члена изменен на тип структурыSalary. созданная структураross, хотите получить доступ к участникамsalaryУчастники по-прежнему могут использовать.образом, например:ross.salary.basic.
Если структура вложена слишком много слоев, когда вы хотите получить доступ к самым внутренним элементам структуры, использование вышеуказанного метода доступа будет включать много промежуточных переменных, что приведет к раздуванию кода. Это можно упростить, используя описанный выше подход с анонимным членом.
Переопределить тип структуры, используя анонимные членыEmpolyee

type Empolyee struct{
	firstName,lastName string
	Salary    // 匿名成员
	bool
}
func main() {
	ross := Empolyee{
		firstName:"Ross",
		lastName:"Bingo",
		bool:true,
		Salary:Salary{1000,100},
	}
	fmt.Println(ross.basic);         // 访问方式一
	fmt.Println(ross.Salary.basic);  // 访问方式二
	ross.basic = 1200
	fmt.Println(ross.basic)          // update
}

Вышеуказанные два метода эквивалентны. Таким образом, процесс доступа упрощается.
нужноУведомлениеДело в том, что члены вложенной анонимной структуры не могут иметь то же имя, что и члены предыдущей структуры.

type Empolyee struct{
	firstName,lastName string
	Salary
	basic int
	bool
}
func main() {
	ross := Empolyee{
		firstName:"Ross",
		lastName:"Bingo",
		bool:true,
		Salary{1000,100},
	}
	fmt.Println(ross.basic)
}

В приведенном выше коде мы модифицируем структуруEmpolyee, добавив доп.Salary.basicэлемент с тем же именем, но компилируется с ошибкой:mixture of field:value and value initializers

экспортируемые члены

Если первая буква переменной или функции в пакете Go написана с большой буквы, переменную или функцию можно экспортировать. Это основной механизм контроля доступа в Go. Если имя переменной-члена структуры написано с заглавной буквы, член также экспортируется. Структура может содержать как экспортируемые, так и неэкспортируемые переменные-члены.
на путиWORKSPACE/src/org/employee.goСоздатьorgпакет, добавьте следующий код:

// employee.go
package org
type Employee struct {
	FirstName,LastName string
	salary int
	fullTime bool
}

надEmployeeструктура, только переменныеFirstName,LastNameэкспортируется. Конечно,EmployeeТакже экспортируется. существуетmainимпортировать в упаковкеorgМешок:

// main.go
package main
import (
	"org"
	"fmt"
)
func main() {
	ross := org.Employee{
		FirstName:"Ross",
		LastName:"Bingo",
		salary:1000,     
	}
	fmt.Println(ross)
}

Приведенный выше код компилируется с ошибкой, поскольку переменная-членsalaryне экспортируется:unknown field 'salary' in struct literal of type org.Employee

потому чтоEmployeeиз сумкиorg, поэтому используйтеorg.Employeeсоздать структуруross. Это можно упростить с помощью псевдонимов типов:

package main

import (
	"org"
	"fmt"
)

type Employee org.Employee; 

func main() {
	ross := Employee{
		FirstName:"Ross",
		LastName:"Bingo",
	}
	fmt.Println(ross)
}

выход:

{Ross Bingo 0 false}

Сравнение структур

Структура сравнима, если все ее элементы сравнимы. можно использовать==а также!=для сравнения, где==— это переменная-член, которая сравнивает две структурные переменные по порядку.

type Employee struct {
	FirstName,LastName string
	salary int
	fullTime bool
}
func main() {
	ross := Employee{
		FirstName:"Ross",
		LastName:"Bingo",
	}
	jack := Employee{
		FirstName:"Jack",
		LastName:"Lee",
	}
	fmt.Println(ross == jack)
}

выход:

false

Структурные переменные разных типов несопоставимы:

type User struct {
	username string
}
type Employee struct {
	FirstName,LastName string
	salary int
	fullTime bool
}
func main() {
	ross := Employee{
		FirstName:"Ross",
		LastName:"Bingo",
	}
	user := User{
		username:"Seekload",
	}
	fmt.Println(ross == user)
}

Ошибка компиляции:invalid operation: ross == user (mismatched types Employee and User) .
Однако, если есть элементы, которые нельзя сравнивать, например:map, структуры несопоставимы.


(Конец полного текста)

Оригинал статьи, если нужно перепечатать, указывайте источник!
Добро пожаловать, чтобы отсканировать код и подписаться на официальный аккаунт »Голанг здесь” или двигатьсяseekload.net, см. больше замечательных статей.

Публичная учетная запись «Голанг идет» подготовила для вас подарочный пакет для изучения тайны, и ответьте на [электронную книгу] в фоновом режиме, чтобы получить его!

公众号二维码