Darsliklar Go Lang Struct

Go Lang Go Lang Struct

Struct — bir nechta turli maydonni bitta yaxlit birlikka jamlaydigan tur. Go’da klass tushunchasi yo’q — struct va unga bog’langan metodlar (keyingi darslarda ko’ramiz) birgalikda Go’ning OOP’ga muqobili hisoblanadi.

Structtype Nom struct { ... } shaklida e’lon qilinadigan, nomlangan maydonlardan iborat qiymat turi. Massiv kabi, struct ham o’zlashtirilganda to’liq nusxalanadi.

Struct e’lon qilish va yaratish

Struct type kalit so’zi bilan e’lon qilinadi, obyekt esa maydon nomlari ko’rsatilgan literal orqali yaratiladi:

package main

import "fmt"

type Foydalanuvchi struct {
    Ism  string
    Yosh int
}

func main() {
    u := Foydalanuvchi{Ism: "Master Sherkulov", Yosh: 30}

    fmt.Println(u.Ism, u.Yosh)
    fmt.Println(u)
    fmt.Printf("%+v\n", u)
}
Master Sherkulov 30
{Master Sherkulov 30}
{Ism:Master Sherkulov Yosh:30}

Maydonga nuqta (.) orqali murojaat qilinadi. Oddiy Println struct’ni qiymatlar ro’yxati sifatida ko’rsatadi, %+v esa maydon nomlari bilan birga — debug qilishda ancha qulay.

Struct — qiymat turi

Massiv kabi, struct ham boshqa o’zgaruvchiga o’zlashtirilganda to’liq nusxalanadi:

package main

import "fmt"

type Nuqta struct {
    X, Y int
}

func main() {
    a := Nuqta{X: 1, Y: 2}
    b := a
    b.X = 100

    fmt.Println(a)
    fmt.Println(b)
}
{1 2}
{100 2}

b := a mustaqil nusxa yaratdi — b.Xni o’zgartirish aga ta’sir qilmadi. Bu xatti-harakat massivnikiga o’xshaydi va Slice yoki Map’dan tubdan farq qiladi.

Struct’larni solishtirish

Barcha maydonlari solishtiriladigan (comparable) turdan bo’lsa, ikkita struct == orqali to’g’ridan-to’g’ri solishtirilishi mumkin:

package main

import "fmt"

type Nuqta struct {
    X, Y int
}

func main() {
    a := Nuqta{1, 2}
    b := Nuqta{1, 2}
    c := Nuqta{3, 4}

    fmt.Println(a == b)
    fmt.Println(a == c)
}
true
false

a == b — barcha maydonlar mos kelgani uchun true. Bu, masalan, Slice yoki Map maydoni bo’lgan struct’larda ishlamaydi — ular solishtirib bo’lmaydigan (non-comparable) turlar, va bunday struct’larni == bilan solishtirishga urinish kompilyatsiya xatosi beradi.

Ichma-ich struct

Struct maydoni sifatida boshqa struct ham bo’lishi mumkin — bu murakkab ma’lumot modelini tabiiy tarzda ifodalaydi:

package main

import "fmt"

type Manzil struct {
    Shahar string
}

type Foydalanuvchi struct {
    Ism    string
    Manzil Manzil
}

func main() {
    u := Foydalanuvchi{
        Ism:    "Farrux",
        Manzil: Manzil{Shahar: "Toshkent"},
    }

    fmt.Println(u.Manzil.Shahar)
}
Toshkent

u.Manzil.Shahar — ichki struct maydoniga ham oddiy nuqta zanjiri orqali murojaat qilinadi. Bu naqsh real dunyodagi ma’lumotlarni (foydalanuvchi, uning manzili, buyurtmasi) tabiiy iyerarxiyada modellashtirish uchun keng qo’llaniladi.