Структуры представляют тип данных, определяемый разработчиком и служащий для представления каких-либо объектов. Структуры содержат набор полей, которые представляют различные атрибуты объекта. Для определения структуры применяются ключевые слова type и struct:
type имя_структуры struct{ поля_структуры }
Каждое поле имеет название и тип данных, как переменная. Например, определим структуру, которая представляет человека:
type person struct{ name string age int }
Структура называется person. Она имеет два поля: name (имя человека, представляет тип string) и age (возраст человека, представляет тип int).
Структура представляет новый тип данных, и мы можем определить переменную данного типа:
var tom person
С помощью инициализатора можно передать структуре начальные значения:
var tom person = person{"Tom", 23}
Инициализатор представляет набор значений в фигурных скобках. Причем эти значения передаются полям структуры в том порядке, в котором поля определены в структуре. Например, в данном случае строка "Tom" передается первому полю - name, а второе значение - 23 передается второму полю - age.
Также мы можем явным образом указать какие значения передаются свойствам:
var alice person = person{age: 23, name: "Alice"}
Также можно использовать сокращенные способы инициализации переменной структуры:
var tom = person {name: "Tom", age: 24} bob := person {name: "Bob", age: 31}
Можно даже не указывать никаких значений, в этом случае свойства структуры получат значения по умолчанию:
undefined := person {} // name - пустая строка, age - 0
Для обращения к полям структуры после переменной ставится точка и указывается поле структуры:
package main import "fmt" type person struct{ name string age int } func main() { var tom = person {name: "Tom", age: 24} fmt.Println(tom.name) // Tom fmt.Println(tom.age) // 24 tom.age = 38 // изменяем значение fmt.Println(tom.name, tom.age) // Tom 38 }
Как и в случае с обычными переменнами, можно создавать указатели на структуры.
package main import "fmt" type person struct{ name string age int } func main() { tom := person {name: "Tom", age: 22} var tomPointer *person = &tom tomPointer.age = 29 fmt.Println(tom.age) // 29 (*tomPointer).age = 32 fmt.Println(tom.age) // 32 }
Для инициализации указателя на структуру необязательно присваивать ему адрес переменной. Можно присвоить адрес безымянного объекта следующим образом:
var tom *person = &person{name:"Tom", age:23} var bob *person = new(person)
Для обращения к полям структуры через указатель можно использовать операцию разыменования ((*tomPointer).age
), либо напрямую обращаться по указателю
(tomPointer.age
).
Также можно определять указатели на отдельные поля структуры:
tom := person {name: "Tom", age: 22} var agePointer *int = &tom.age // указатель на поле tom.age *agePointer = 35 // изменяем значение поля fmt.Println(tom.age) // 35