Skip to content

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:

Model: Tesla
Narxi: $90000

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:

1
2
3
4
5
6
7
8
type Avtomobil struct {
    Model string
    Narx  int
}

func (avto Avtomobil) AvtoInfo() {
    fmt.Printf("Model: %s\nNarxi: $%d", avto.Model, avto.Narx)
}

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:

package main

import "fmt"

type Avtomobil struct {
    Model string
    Narx  int
}

func (avto Avtomobil) AvtoInfo() {
    fmt.Printf("Model: %s\nNarxi: $%d", avto.Model, avto.Narx)
}

func main() {
    mashina := Avtomobil{Model: "Tesla", Narx: 90000}
    mashina.AvtoInfo()
}

Natija:

Model: Tesla
Narxi: $90000

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:

package main

import "fmt"

type Avtomobil struct {
    Model string
    Narx  int
}

// Pointer receiver bilan qiymatni o'zgartirish
func (avto *Avtomobil) ChegirmaFoiz(foiz int) {
    avto.Narx = avto.Narx - (avto.Narx * foiz / 100)
}

func main() {
    mashina := Avtomobil{Model: "Tesla", Narx: 90000}

    fmt.Println("Oldingi narx:", mashina.Narx)
    mashina.ChegirmaFoiz(10) // avtomatik pointerga qiymat beriladi
    fmt.Println("Yangi narx:", mashina.Narx)
}

Natija:

Oldingi narx: 90000
Yangi narx: 81000

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