Structlar

Go'da `struct` — maydonlardan (fields) iborat tiplangan kolleksiya. Ma'lumotlarni birlashtirib, yozuv (record) yaratish uchun ishlatiladi.
package main

import "fmt"

// person struct turi name va age maydonlariga ega
type person struct {
    name string
    age  int
}

// newPerson berilgan nom bilan yangi person yaratadi
func newPerson(name string) *person {
    // Go — garbage collected til; lokal o'zgaruvchiga ko'rsatkichni qaytarish xavfsiz
    // Unga faol murojaatlar tugaganidagina GC uni tozalaydi
    p := person{name: name}
    p.age = 42
    return &p
}

func main() {

    // Yangi struct yaratish sintaksisi
    fmt.Println(person{"Bob", 20})

    // Structni maydon nomlari bilan initsializatsiya qilish
    fmt.Println(person{name: "Alice", age: 30})

    // Ko'rsatilmagan maydonlar zero-value bo'ladi
    fmt.Println(person{name: "Fred"})

    // & prefiksi struct'ga ko'rsatkich qaytaradi
    fmt.Println(&person{name: "Ann", age: 40})

    // Yangi struct yaratishni konstruktor funksiyaga kapsulalash — idiomatik yondashuv
    fmt.Println(newPerson("Jon"))

    // Maydonlarga nuqta orqali murojaat qilish
    s := person{name: "Sean", age: 50}
    fmt.Println(s.name)

    // Struct ko'rsatkichlari bilan ham nuqta ishlatiladi — avtomatik dereferens bo'ladi
    sp := &s
    fmt.Println(sp.age)

    // Structlar o'zgaruvchan (mutable)
    sp.age = 51
    fmt.Println(sp.age)

    // Faqat bitta qiymat uchun ishlatilsa, nom bermasdan anonim struct yozish mumkin
    // Bu usul ko'pincha jadvalga asoslangan testlarda qo'llanadi
    dog := struct {
        name   string
        isGood bool
    }{
        "Rex",
        true,
    }
    fmt.Println(dog)
}

Terminalda bajarish:

$ go run structs.go
{Bob 20}
{Alice 30}
{Fred 0}
&{Ann 40}
&{Jon 42}
Sean
50
51
{Rex true}