Go в примери: Структури

Структурите в Go представляват съвкупност от полета от различни видове данни. Те са полезни за съчетаване на данни заедно и по този начин да се съставят записи.

package main
import "fmt"

Този вид структура, наречен person, има полета с имена name и age.

type person struct {
    name string
    age  int
}

Тази функция newPerson съставя нов запис от вида person с подадено име.

func newPerson(name string) *person {

Go е език, в който заеманата от програмата памет се освобождава автоматично. Безопасно е да върнете указател към създадена във функцията променлива. Паметта, заемана от данните, към които сочи той, ще бъде освободена от събирача на отпадъци1, когато вече няма действащи препратки към данните.


  1. garbage collector – събирач на боклука – автоматично управление на паметта
    p := person{name: name}
    p.age = 42
    return &p
}
func main() {

Така съдаваме нов запис от структурния вид person.

    fmt.Println(person{"Пешо", 20})

Можете да ползвате имената на полетата, когато създавате нов структурен запис (нова структура).

    fmt.Println(person{name: "Лиляна", age: 30})

Пропуснатите полета се създават с нулеви стойности.

    fmt.Println(person{name: "Тодор"})

Ако предпоставим &, получаваме указател към структурата.

    fmt.Println(&person{name: "Ани", age: 40})

Прието е да затваряме създаването на нова структура във функции, наречени конструктори.

    fmt.Println(newPerson("Иван"))

Полетата се достъпват, като напишем точка, последвана от името на полето.

    s := person{name: "Явор", age: 50}
    fmt.Println(s.name)

Можете да ползвате точка и с указатели към структури. Прекият достъп до данните е автоматичен.

    sp := &s
    fmt.Println(sp.age)

Структурите са меними1.


  1. mutable – меними, не само за четене, както са низовете.
    sp.age = 51
    fmt.Println(sp.age)

Ако използваме някакъв вид структура само за някаква единична стойност, не е нужно да даваме име на вида структура. Стойността може да бъде от безименен вид структура. Този начин на създаване на на структурни записи се ползва често за таблици от тестове.

    куче := struct {
        име      string
        доброЛиЕ bool
    }{
        "Рекс",
        true,
    }
    fmt.Println(куче)
}
$ go run structs.go
{Пешо 20}
{Лиляна 30}
{Тодор 0}
&{Ани 40}
&{Иван 42}
Явор
50
51
{Рекс true}

Следващ пример: .