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.
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:
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:
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.
Xuddi oddiy o'zgaruvchilar kabi, funksiyalardan ko'rsatkich (*tur) qaytarish ham mumkin:
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:
Matn: Go Dasturchi
Go dasturlash tilida argumentlarni funksiyaga uzatishning ikkita asosiy usuli mavjud:
O'zgaruvchining faqat nusxasi funksiyaga uzatiladi. Funksiya ichida nusxaning o'zgarishi asl o'zgaruvchiga hech qanday ta'sir o'tkazmaydi.
Funksiyaga xotira manzili ko'rsatkich orqali uzatiladi. Funksiya to'g'ridan-to'g'ri asl xotira katakchasi bilan ishlaydi.
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:
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.