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 qaytarishGo 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 errnil (<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.