Go’da funksiyalar
Funksiya ma’lum vazifani bajaradigan nomlangan kod blokidir. U takroriy kodni bir joyga yig‘adi, dasturni kichik qismlarga ajratadi va har bir qismni alohida sinashni osonlashtiradi.
E’lon qilish va chaqirish
Parametr funksiya e’lonidagi o‘zgaruvchi, argument esa chaqirish paytida berilgan aniq qiymatdir.
package main
import "fmt"
func salomlash(ism string) string {
return "Salom, " + ism + "!"
}
func main() {
xabar := salomlash("Ali")
fmt.Println(xabar)
}
Natija:
salomlash bitta string parametr qabul qiladi va string qaytaradi. return funksiyani yakunlab, qiymatni chaqirilgan joyga beradi. Hech narsa qaytarmaydigan funksiyada qaytish turi yozilmaydi.
Bir xil turdagi ketma-ket parametrlar qisqa yozilishi mumkin: func qo‘sh(a, b int) int.
Bir nechta qiymat qaytarish
Go funksiyasi bir nechta qiymat qaytara oladi. Bu natija bilan birga xatoni qaytarishda ko‘p ishlatiladi:
package main
import "fmt"
func bolish(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("nolga bo‘lish mumkin emas")
}
return a / b, nil
}
func main() {
natija, err := bolish(10, 4)
if err != nil {
fmt.Println("Xato:", err)
return
}
fmt.Println("Natija:", natija)
}
Natija:
b nol bo‘lsa, hisob bajarilmaydi va xato qaytadi. Real API, fayl yoki database kodida xatoni e’tiborsiz qoldirmaslik shu usulga tayanadi. Qiymatlardan biri kerak bo‘lmasa, _ bilan tashlab ketish mumkin.
Nomlangan qaytish qiymatlari ham mavjud, ammo qisqa funksiyalardan tashqarida oddiy return qiymat ko‘pincha ravshanroq. Yalang‘och return uzun funksiyada qaysi qiymat qaytayotganini yashirishi mumkin.
Argumentlar qiymat sifatida uzatiladi
Go’da barcha argumentlar qiymat sifatida uzatiladi. Funksiya parametrning o‘z nusxasini oladi:
package main
import "fmt"
func oshir(n int) {
n++
}
func main() {
son := 10
oshir(son)
fmt.Println(son)
}
Natija:
Slice, map, channel va pointer ham qiymat sifatida uzatiladi. Lekin ularning nusxalangan qiymati umumiy asosiy ma’lumotga murojaat qilishi mumkin. Shu sabab “hamma narsa nusxalanadi” qoidasi o‘zgarishlar hech qachon ko‘rinmaydi degani emas.
Variadik funksiya
Oxirgi parametr ...T bo‘lsa, funksiya nol yoki ko‘p T argument qabul qiladi. Funksiya ichida u []T sifatida ishlatiladi:
package main
import "fmt"
func yigindi(sonlar ...int) int {
natija := 0
for _, son := range sonlar {
natija += son
}
return natija
}
func main() {
fmt.Println(yigindi(1, 2, 3, 4))
sonlar := []int{5, 6, 7}
fmt.Println(yigindi(sonlar...))
}
Natija:
Mavjud slice elementlarini alohida argumentlarga yoyish uchun sonlar... yoziladi. Variadik parametr faqat oxirgi parametr bo‘lishi mumkin.
Funksiya qiymati va anonim funksiya
Funksiyalar ham qiymatdir: ularni o‘zgaruvchiga berish va boshqa funksiyaga uzatish mumkin.
package main
import "fmt"
func hisobla(a, b int, amal func(int, int) int) int {
return amal(a, b)
}
func main() {
kopaytir := func(a, b int) int {
return a * b
}
fmt.Println(hisobla(4, 5, kopaytir))
}
Natija:
Anonim funksiya tashqi scope’dagi o‘zgaruvchini ishlatsa, closure hosil bo‘ladi. Closure o‘sha o‘zgaruvchini keyingi chaqiruvlar orasida ham saqlashi mumkin. Callback, middleware va konfiguratsiya funksiyalarida bu usul uchraydi.
Rekursiya
Funksiya o‘zini chaqirishi rekursiya deyiladi. U albatta to‘xtash shartiga ega bo‘lishi kerak:
package main
import "fmt"
func faktorial(n uint64) uint64 {
if n <= 1 {
return 1
}
return n * faktorial(n-1)
}
func main() {
fmt.Println(faktorial(5))
}
Natija:
Har chaqiruv stack’da joy ishlatadi. Juda chuqur rekursiya resurs sarfini oshiradi; oddiy ketma-ket hisoblarda sikl tushunarliroq bo‘lishi mumkin. uint64 faktorialda overflow bo‘lishi mumkin, shuning uchun bu misol cheksiz katta sonlar uchun emas.
Xulosa
- Parametr e’londa, argument chaqiruvda ishlatiladi.
- Funksiya nol, bitta yoki bir nechta qiymat qaytarishi mumkin.
- Go argumentlarni qiymat sifatida uzatadi.
- Variadik parametr funksiya ichida slice sifatida ko‘rinadi.
- Funksiya qiymatlari callback va closure yaratishga imkon beradi.
- Rekursiyada aniq to‘xtash sharti bo‘lishi kerak.
Keyingi darsda funksiyaga pointer uzatib, chaqiruvchi qiymatini qanday o‘zgartirish ko‘rib chiqiladi.