Массивы в языке 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, см. больше замечательных статей.
Публичная учетная запись «Голанг идет» подготовила для вас подарочный пакет для изучения тайны, и ответьте на [электронную книгу] в фоновом режиме, чтобы получить его!