Skip to content

Go struct

Info

Struct — turli turdagi ma’lumotlarni bir obyekt sifatida guruhlash va saqlash imkonini beruvchi, foydalanuvchi tomonidan yaratiladigan ma’lumot tuzilmasi bo‘lib, u yangi tur (type) hisoblanadi.

Massivlar bir xil turdagi ma'lumotlar to'plamini bitta o'zgaruvchida saqlash uchun ishlatilsa, struct turli xil ma'lumotlar turlarini bitta o'zgaruvchida saqlash uchun ishlatiladi.

struct an’anaviy obyektga yo‘naltirilgan dasturlash tillaridagi sinflarga o‘xshash, lekin meros olish (inheritance) mavjud emas. structlar yordamida dasturni soddalashtirish va kodni o‘qilishi osonroq qilish mumkin.

Goda structni e'lon qilish uchun type va struct kalit so'zlaridan foydalaniladi:

type struct_name struct {
  Field1 datatype;
  Field2 datatype;
  Field3 datatype;
  ...
}

Misol:

type Person struct {
  name string
  age int
  job string
  salary int
}

struct nima uchun kerak?

Agar dasturda bir-biri bilan bog‘liq bir nechta o‘zgaruvchilar bo‘lsa, ularni bitta tuzilma (struct) ichida saqlash qulay bo‘ladi. Misol uchun, biror foydalanuvchi ma’lumotlarini saqlash uchun quyidagi struct ni yaratish mumkin:

package main

import "fmt"

type User struct {
    Name   string
    Age    int
    Email  string
}

func main() {
    user := User{
        Name:  "Ali",
        Age:   25,
        Email: "[email protected]",
    }

    fmt.Println("Ism:", user.Name)
    fmt.Println("Yosh:", user.Age)
    fmt.Println("Email:", user.Email)
}

struct e'lon qilish boshqa usullari

E'lon qilish:

type Car struct {
    Brand string
    Model string
    Year  int
}

Ma'lumot qo'shish:

car := Car{
    Brand: "Toyota",
    Model: "Camry",
    Year:  2022,
}

Tartibi bo'yicha ma'lumot qo'shish:

car := Car{"Honda", "Civic", 2021}

Bo'sh struct e'lon qilish va maydon qo'shish:

var car Car
car.Brand = "BMW"
car.Model = "X5"
car.Year = 2023

struct ichida struct

package main

import "fmt"

type Engine struct {
    HorsePower int
    Type       string
}

type Car struct {
    Brand  string
    Model  string
    Engine Engine
}

func main() {
    car := Car{
        Brand: "Mercedes",
        Model: "S-Class",
        Engine: Engine{
            HorsePower: 500,
            Type:       "V8",
        },
    }
    fmt.Println("Brend:", car.Brand)
    fmt.Println("Model:", car.Model)
    fmt.Println("Dvigatel quvvati:", car.Engine.HorsePower, "ot kuchi")
}

struct da default (nol) qiymatlar

package main

import "fmt"

type Product struct {
    Name  string
    Price float64
    Stock int
}

func main() {
    var item Product
    fmt.Println("Nomi:", item.Name)  // ""
    fmt.Println("Narxi:", item.Price) // 0
    fmt.Println("Omborda:", item.Stock) // 0
}

Bo‘sh structdan foydalanish

package main

import "fmt"

func main() {
    uniqueItems := make(map[string]struct{})

    uniqueItems["apple"] = struct{}{}
    uniqueItems["banana"] = struct{}{}
    uniqueItems["apple"] = struct{}{} // Takroriy kiritish

    fmt.Println("Mavjud mahsulotlar:")
    for item := range uniqueItems {
        fmt.Println(item)
    }
}

Anonim struct dan foydalanish

Agar biz struct ni faqat bir marta ishlatmoqchi bo‘lsak, uning nomini bermasdan anonim struct yaratishimiz mumkin.

package main

import "fmt"

func main() {
    person := struct {
        Name string
        Age  int
    }{
        Name: "Rustam",
        Age:  27,
    }

    fmt.Println("Ism:", person.Name, "| Yosh:", person.Age)
}

struct ning o'lchamini tekshirish

Agar struct qancha xotira egallashini bilmoqchi bo'lsak, unsafe.Sizeof() funksiyasidan foydalanish mumkin.

package main

import (
    "fmt"
    "unsafe"
)

type Example struct {
    A int32
    B bool
    C float64
}

func main() {
    fmt.Println("Struct hajmi (baytlarda):", unsafe.Sizeof(Example{}))
}

Goda struct juda kuchli va moslashuvchan tuzilma bo‘lib, u ma’lumotlarni aniq va tartibli saqlashga imkonini beradi.

Anonim maydonlar (anonymous field)

Agar struct ichida boshqa struct ni to‘g‘ridan-to‘g‘ri kiritib, meros olish (embedding) kerak bo‘lsa, anonim maydonlar ishlatiladi.

package main

import "fmt"

type TexnikXususiyatlar struct {
    Quvvat int
    Ogirlik int
}

type Avtomobil struct {
    Model string
    Narx  int
    TexnikXususiyatlar
}

func main() {
    mashina := Avtomobil{
        Model: "Tesla",
        Narx:  90000,
        TexnikXususiyatlar: TexnikXususiyatlar{Quvvat: 500, Ogirlik: 2000},
    }

    fmt.Println("Model:", mashina.Model)
    fmt.Println("Narxi: $", mashina.Narx)
    fmt.Println("Quvvati:", mashina.Quvvat) // TexnikXususiyatlar.Quvvat
    fmt.Println("Og'irligi:", mashina.Ogirlik) // TexnikXususiyatlar.Ogirlik
}

Natija:

Model: Tesla
Narxi: $ 90000
Quvvati: 500
Og'irligi: 2000

TexnikXususiyatlar structi Avtomobil ichida anonim maydon sifatida ishlatilgani uchun Quvvat va Ogirlik ni to‘g‘ridan-to‘g‘ri ishlata olamiz.