Структуры

Последнее обновление: 24.12.2017

Структуры представляют тип данных, определяемый разработчиком и служащий для представления каких-либо объектов. Структуры содержат набор полей, которые представляют различные атрибуты объекта. Для определения структуры применяются ключевые слова 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850