Method
Method mavzusini boshlashdan oldin funksiya va struc ga qisqacha to'xtalib o'tsak maqsadga muvofiq bo'ladi.
Funksiya va Struct
Go tilida funksiya va struct — bu kodni modular qilish va ma’lumotlarni tuzilmaviy saqlashning asosiy elementlari hisoblanadi.
- Funksiya — takrorlanadigan kod bloklarini guruhlash va chaqirish imkonini beradi.
- 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.
Struct bilan funksiyani birga ishlatish
package main
import "fmt"
type Avtomobil struct {
Model string
Narx int
}
func AvtoInfo(avto Avtomobil) {
fmt.Printf("Model: %s\nNarxi: $%d", avto.Model, avto.Narx)
}
func main() {
mashina := Avtomobil{Model: "Tesla", Narx: 90000}
AvtoInfo(mashina)
}
Natija:
Yuqoridagi misolda funksiyaga avto deb nomalngan argument berildi va uning turi esa Avtomobil bo'ldi. Sababi
struct ham bu tur! Boshqa turlardan farqi struct bilan dasturchi o'z turini hosil qilishi mumkin. struct e'lon
qilinishiga ham e'tibor bering type bilan boshlanyapdi bundan yangi tur e'lon qilinayotganini xulosa qilish mumkin.
Method
Info
Method — struct yoki boshqa tur (type) ga bog‘langan funksiya bo‘lib, u shu turga oid amallarni bajarish uchun xizmat qiladi.
method va funksiya farqi
- Oddiy funksiya hech qanday ma’lumot turiga bog‘liq emas.
- Method esa aniq bir tur (struct yoki type) ga bog‘lanadi va u orqali shu tur bilan bog‘liq amallarni bajarishi mumkin.
Yquoridagi Avtomobil struct(yangi tur)imiz misolida method nima ekanini tushinishga harakat qilamiz. Bu misolda funksiya va struct
bir biriga bog'liq emas, shunchaki Avtomobil turimizni ma'lumotlarini chop qilish uchun xolos. Quyida method ga
o'zgartirib ko'ramiz.
Biror funksiya struct methodi ekanligini bildirish uchun funksiyani e'lon qilshda, funksiya nomidan oldin qo'shimcha
argument qo'shish kerak bo'ladi. Bu quyidagicha amalga oshiriladi:
Yuqoridagi misolda AvtoInfo() funksiya nomi, bu funksiyani qaysi struct ga tegishli ekanini esa (avto Avtomobil)
bildiryapdi.
Bu misoldagi misolni to'ldirib ishga tushirib ko'ramiz:
Natija:
E'tibor bering AvtoInfo() funksiyasi o'zi emas balki Avtomobil structi bilan ishga tushirildi. Bu AvtoInfo funksiyasi
Avtomobil ga tegishli method ekanligini anglatadi.
Struct method va pointer
Agar struct ichidagi ma’lumotlarni method orqali o‘zgartirish kerak bo‘lsa, pointer receiver (*) dan foydalanish lozim.
Pointerga misol:
Natija:
Info
Go avtomatik ravishda struct obyektlarini pointerga aylantirib beradi!
Struct methodlarini * (pointer receiver) bilan e'lon qilsak ham,
obyektni yaratishda & bilan berish shart emas. Method chaqirilganda avtomatik pointerga aylanadi.
Oddiy Receiver (T) va Pointer Receiver (*T) farqlari
| Xususiyat | Oddiy Receiver (T) |
Pointer Receiver (*T) |
|---|---|---|
| Method structning nusxasi bilan ishlaydi | ✅ | ❌ |
| Asl obyektni o‘zgartiradi | ❌ | ✅ |
| Xotirani tejaydi | ❌ | ✅ |
| Katta struct uchun samarali | ❌ | ✅ |
| Mutatsiya (o‘zgarish) qilish uchun ishlatiladi | ❌ | ✅ |