28 / 68

Pointers and Functions

Ko'rsatkichlar va Funksiyalar

Go dasturlash tilida ko'rsatkichlarni funksiyalarga argument sifatida uzatish yoki funksiyadan ko'rsatkich qaytarish mumkin. Bu usul xotiradan nusxa ko'chirish xarajatlarini tejash va funksiya ichida turib asl o'zgaruvchi qiymatini to'g'ridan-to'g'ri o'zgartirish uchun ishlatiladi.


1. Ko'rsatkichni funksiya argumenti sifatida uzatish

Funksiyaga o'zgaruvchining qiymatini emas, balki uning xotira manzilini (&o'zgaruvchi) uzatsak, funksiya ko'rsatkich (*tur) orqali ushbu xotira katakchasini to'g'ridan-to'g'ri o'zgartira oladi:

example.go
package main

import "fmt"

// Argument sifatida ko'rsatkich qabul qiladi
func update(num *int) {
    // Manzildagi asl qiymatni o'zgartiramiz
    *num = 30
}

func main() {
    var number = 55

    // Funksiyaga number o'zgaruvchisining manzilini uzatamiz
    update(&number)

    fmt.Println("Asl o'zgaruvchi qiymati:", number)
}

Natija:

kod
Asl o'zgaruvchi qiymati: 30

Bu yerda number va num bitta xotira manziliga qarab turgani uchun, funksiya ichida *num ning o'zgarishi tashqaridagi number ning ham o'zgarishiga olib keldi.


2. Funksiyadan ko'rsatkich qaytarish (Return Pointers)

Xuddi oddiy o'zgaruvchilar kabi, funksiyalardan ko'rsatkich (*tur) qaytarish ham mumkin:

example.go
package main

import "fmt"

func display() *string {
    message := "Go Dasturchi"

    // message o'zgaruvchisining manzilini qaytaramiz
    return &message
}

func main() {
    // result o'zgaruvchisi xotira manzilini qabul qiladi
    result := display()

    // *result orqali xotiradagi qiymatni o'qiymiz
    fmt.Println("Matn:", *result)
}

Natija:

kod
Matn: Go Dasturchi

3. Qiymat bo'yicha uzatish (Call by Value) vs Havola bo'yicha uzatish (Call by Reference)

Go dasturlash tilida argumentlarni funksiyaga uzatishning ikkita asosiy usuli mavjud:

Call by Value (Qiymat bo'yicha uzatish):

O'zgaruvchining faqat nusxasi funksiyaga uzatiladi. Funksiya ichida nusxaning o'zgarishi asl o'zgaruvchiga hech qanday ta'sir o'tkazmaydi.

Call by Reference (Havola / Manzil bo'yicha uzatish):

Funksiyaga xotira manzili ko'rsatkich orqali uzatiladi. Funksiya to'g'ridan-to'g'ri asl xotira katakchasi bilan ishlaydi.

example.go
package main

import "fmt"

// Qiymat bo'yicha uzatish (nusxa bilan ishlaydi)
func callByValue(num int) {
    num = 30
    fmt.Println("callByValue ichida:", num) // 30
}

// Havola bo'yicha uzatish (ko'rsatkich bilan ishlaydi)
func callByReference(num *int) {
    *num = 10
    fmt.Println("callByReference ichida:", *num) // 10
}

func main() {
    var number = 100

    fmt.Println("Boshlang'ich:", number) // 100

    // 1. Call by Value
    callByValue(number)
    fmt.Println("callByValue dan so'ng:", number) // 100 (o'zgarmadi)

    // 2. Call by Reference
    callByReference(&number)
    fmt.Println("callByReference dan so'ng:", number) // 10 (o'zgardi!)
}

Natija:

kod
Boshlang'ich: 100
callByValue ichida: 30
callByValue dan so'ng: 100
callByReference ichida: 10
callByReference dan so'ng: 10

Katta hajmdagi ma'lumotlar (masalan, yirik strukturalar yoki massivlar) bilan ishlaganda, butun ma'lumotni nusxalash xotira va vaqt talab qiladi. Shuning uchun ularni funksiyaga havola (ko'rsatkich) ko'rinishida uzatish ancha samaralidir.