Darsliklar Go Lang Funksiya parametrlari

Go Lang Go Lang Funksiya parametrlari

Funksiya parametrlari — metodga tashqaridan ma’lumot uzatish vositasi. Go’da bu mavzuning ikkita o’ziga xos jihati bor: bir nechta qiymatni birga qaytarish va cheksiz sondagi argument (variadic).

Ko’p qiymat qaytarish — Go funksiyasi bittadan ortiq natijani bir vaqtda qaytara oladi. Bu, ayniqsa, natija va xatoni birga qaytarishning Go’dagi standart usuli.

Bir nechta qiymat qaytarish

Qaytish turlari qavs ichida, vergul bilan ajratilib yoziladi:

package main

import (
    "errors"
    "fmt"
)

func bolish(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("nolga bo'lish mumkin emas")
    }
    return a / b, nil
}

func main() {
    natija, err := bolish(10, 2)
    fmt.Println(natija, err)

    natija2, err2 := bolish(5, 0)
    fmt.Println(natija2, err2)
}
5 <nil>
0 nolga bo'lish mumkin emas

bolish ikkita qiymat — natija va xato — qaytaradi. Muvaffaqiyatli holatda err — nil (<nil> sifatida chop etiladi), xato bo’lganda esa natija zero-value (0), xato esa tavsif bilan qaytadi. Bu naqsh — Go’da istisno (exception) o’rniga ishlatiladigan standart xato boshqaruvi, keyingi darslarda alohida chuqur ko’ramiz.

Variadic parametr — cheksiz sondagi argument

Argumentlar soni oldindan noma’lum bo’lsa, tur oldidan ... yoziladi — bu funksiya ichida oddiy slice sifatida ko’rinadi:

package main

import "fmt"

func yigindi(sonlar ...int) int {
    jami := 0
    for _, son := range sonlar {
        jami += son
    }
    return jami
}

func main() {
    fmt.Println(yigindi(1, 2, 3))
    fmt.Println(yigindi(10, 20, 30, 40))
    fmt.Println(yigindi())
}
6
100
0

sonlar ...int — chaqiruvda berilgan barcha argumentlarni []int slice’ga yig’adi. Argument umuman berilmasa (yigindi()), sonlar bo’sh slice bo’ladi, natija 0 bo’ladi. fmt.Println ning o’zi ham aynan shu mexanizm — ...interface{} — orqali ishlaydi.

Mavjud slice’ni variadic’ga uzatish

Qo’lda allaqachon mavjud slice’ni variadic parametrga uzatish uchun uning oxiriga ... qo’shiladi:

package main

import "fmt"

func yigindi(sonlar ...int) int {
    jami := 0
    for _, son := range sonlar {
        jami += son
    }
    return jami
}

func main() {
    royxat := []int{5, 10, 15}
    fmt.Println(yigindi(royxat...))
}
30

yigindi(royxat...) — royxat slice’ining barcha elementlarini alohida argumentlarga “yoyib” uzatadi. ...siz, yigindi(royxat) yozilsa, Go tur mos kelmasligi haqida kompilyatsiya xatosi berardi — []int bilan ...int bir xil emas.

Funksiyani qiymat sifatida uzatish

Go’da funksiya — birinchi darajali qiymat: uni o’zgaruvchiga saqlash, boshqa funksiyaga parametr sifatida uzatish mumkin:

package main

import "fmt"

func amalniBajar(a, b int, amal func(int, int) int) int {
    return amal(a, b)
}

func kopaytir(x, y int) int {
    return x * y
}

func main() {
    natija := amalniBajar(6, 7, kopaytir)
    fmt.Println(natija)
}
42

amal func(int, int) int — parametr turi sifatida boshqa funksiyaning “imzosi” ko’rsatildi. amalniBajar qaysi amalni bajarishni o’zi bilmaydi — bu qaror chaqiruvchi tomonidan, kopaytir funksiyasini uzatish orqali, tashqaridan beriladi.