29 / 68

Pointers to Struct

Strukturaga ko'rsatkichlar

Go dasturlash tilida oddiy o'zgaruvchilar kabi tuzilmalarga (struct) ham ko'rsatkichlar yaratish mumkin. Bu orqali katta hajmli obyektlarning nusxasini yaratmasdan, ularning asl maydonlarini bevosita o'zgartirish imkoni paydo bo'ladi.


1. Strukturaga ko'rsatkich yaratish

Faraz qilaylik, bizda Person strukturasi mavjud:

example.go
type Person struct {
    name string
    age  int
}

Ushbu strukturadan nusxa olib, uning xotira manzilini ko'rsatkich o'zgaruvchisiga o'zlashtirishimiz mumkin:

example.go
package main

import "fmt"

type Person struct {
    name string
    age  int
}

func main() {
    // Struktura nusxasi
    person1 := Person{"Ali", 25}

    // person1 manzilini saqlovchi ko'rsatkich
    var ptr *Person
    ptr = &person1

    fmt.Println("person1:", person1)
    fmt.Println("ptr:", ptr)
}

Natija:

kod
person1: {Ali 25}
ptr: &{Ali 25}

[!TIP] Ko'rsatkichni qisqartirilgan shaklda yaratish juda qulay:

example.go
ptr := &person1

2. Ko'rsatkich orqali struktura maydonlariga murojaat qilish

C yoki C++ tillarida ko'rsatkich orqali maydonga kirish uchun -> yoki (*ptr).field yozish talab etiladi. Biroq Go dasturlash tilida sintaksis ancha soddalashtirilgan: to'g'ridan-to'g'ri nuqta . operatori orqali murojaat qilish mumkin (Go buni avtomatik dereferensiya qiladi):

example.go
package main

import "fmt"

type Person struct {
    name string
    age  int
}

func main() {
    person := Person{"Ali", 25}
    ptr := &person

    // To'g'ridan-to'g'ri nuqta orqali maydonlarni o'qiymiz
    fmt.Println("Ismi:", ptr.name)
    fmt.Println("Yoshi:", ptr.age)

    // Bu (*ptr).name bilan aynan bir xil
    fmt.Println("Ismi (*ptr bilan):", (*ptr).name)
}

Natija:

kod
Ismi: Ali
Yoshi: 25
Ismi (*ptr bilan): Ali

3. Ko'rsatkich orqali struktura maydonini o'zgartirish

Ko'rsatkich yordamida strukturaning asl ma'lumotlarini to'g'ridan-to'g'ri o'zgartirish mumkin:

example.go
package main

import "fmt"

type Weather struct {
    city        string
    temperature int
}

func main() {
    weather := Weather{"Toshkent", 20}
    fmt.Println("Boshlang'ich ob-havo:", weather)

    // Strukturaga ko'rsatkich olamiz
    ptr := &weather

    // Ko'rsatkich orqali temperaturani o'zgartiramiz
    ptr.temperature = 25

    fmt.Println("Yangilangan ob-havo:", weather)
}

Natija:

kod
Boshlang'ich ob-havo: {Toshkent 20}
Yangilangan ob-havo: {Toshkent 25}

ptr.temperature = 25 amali bajarilganda weather obyektining temperature maydoni bevosita o'zgardi.