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.