21 / 68

Functions

Funksiyalar

Funksiya — bu ma'lum bir aniq vazifani bajarishga mo'ljallangan kodlar blokidir.

Dasturlashda kodni kichik, mantiqiy qismlarga bo'lish uchun funksiyalardan foydalaniladi. Bu kodni o'qishni osonlashtiradi, xatolarni tezda topishga yordam beradi va bir xil kodni qayta-qayta yozish zaruriyatini yo'qotadi (kodni qayta ishlatish — code reusability).


1. Goda funksiya yaratish va chaqirish

Go tilida funksiyalar func kalit so'zi yordamida e'lon qilinadi:

example.go
func funksiyaNomi() {
    // bajariladigan kod
}

Funksiya tanasidagi kod uning o'zi chaqirilmaguncha ishga tushmaydi. Masalan, quyidagi dasturda greet() e'lon qilingan, lekin main() ichida hech qayerda chaqirilmagan:

example.go
package main

import "fmt"

func greet() {
    fmt.Println("Xayrli tong!")
}

func main() {
    // greet() bu yerda chaqirilmagan
}

Bu dasturni ishga tushirsangiz, hech qanday natija chiqmaydi — chunki funksiya faqat e'lon qilingan, lekin chaqirilmagan. Funksiyani ishga tushirish uchun uning nomidan so'ng qavslar () qo'yib chaqirish kerak.

Misol: Oddiy funksiya

example.go
package main

import "fmt"

// Funksiyani e'lon qilamiz
func greet() {
    fmt.Println("Xayrli tong!")
}

func main() {
    // Funksiyani chaqiramiz
    greet()
}

Natija:

kod
Xayrli tong!

Dastur qanday ishlaydi:

Goda funksiyaning ishlashi


2. Parametrli funksiyalar (Function Parameters)

Funksiyalar har doim bir xil ishni bajarmasdan, turli xil ma'lumotlar bilan dinamik ishlashi uchun parametrlar qabul qilishi mumkin:

example.go
func funksiyaNomi(parametr1 turi, parametr2 turi) {
    // kod
}

Misol: Ikkita sonni qo'shuvchi funksiya

example.go
package main

import "fmt"

// n1 va n2 parametrlarini qabul qiluvchi funksiya
func addNumbers(n1 int, n2 int) {
    sum := n1 + n2
    fmt.Println("Yig'indi:", sum)
}

func main() {
    // Argumentlar uzatib funksiyani chaqiramiz
    addNumbers(21, 13)
    addNumbers(50, 45)
}

Natija:

kod
Yig'indi: 34
Yig'indi: 95

Dastur qanday ishlaydi:

Parametrli funksiyaning ishlashi

Funksiya chaqirilganda uzatilgan argumentlar funksiya parametrlariga tayinlanadi: 21 — n1ga, 13 esa n2ga.

[!NOTE] Funksiyaga uzatilayotgan qiymatlarning ma'lumot turi funksiya parametrlarida belgilangan turga to'liq mos kelishi shart.


3. Qiymat qaytaruvchi funksiyalar (return)

Funksiya ichida hisoblangan natijani dasturning boshqa qismlarida ishlatish uchun return operatori orqali qaytarish mumkin. Buning uchun funksiya parametrlari ro'yxatidan keyin qaytadigan ma'lumot turi ko'rsatiladi:

example.go
func addNumbers(n1 int, n2 int) int {
    sum := n1 + n2
    return sum
}

Misol:

example.go
package main

import "fmt"

func addNumbers(n1 int, n2 int) int {
    sum := n1 + n2
    return sum
}

func main() {
    // Qaytgan natijani o'zgaruvchida saqlaymiz
    result := addNumbers(21, 13)

    fmt.Println("Natija:", result)
}

Natija:

kod
Natija: 34

Dastur qanday ishlaydi:

Qiymat qaytaruvchi funksiyaning ishlashi

[!WARNING] return operatori funksiya ishini butunlay yakunlaydi. return dan keyin yozilgan har qanday kod bajarilmaydi va Go kompilyatori xatolik berishi mumkin.

Masalan, quyidagi kodda return dan keyin yana bir qator kod yozilgan:

example.go
package main

import "fmt"

func addNumbers(n1 int, n2 int) int {
    sum := n1 + n2
    return sum

    // return dan keyingi kod
    fmt.Println("return dan keyingi qator")
}

func main() {
    result := addNumbers(21, 13)
    fmt.Println("Natija:", result)
}

Bu kodni kompilyatsiya qilishga urinsak, missing return at the end of function xatoligiga o'xshash xatolik olamiz — chunki returndan keyingi qator hech qachon bajarilmaydigan (unreachable) kod hisoblanadi va Go kompilyatori buni xato deb hisoblaydi.


4. Bir nechta qiymat qaytarish (Multiple Return Values)

Go tilining eng qulay imkoniyatlaridan biri shundaki, bitta funksiya bir vaqtning o'zida bir nechta qiymat qaytara oladi. Qaytariladigan turlar qavs ichida vergul bilan yoziladi:

example.go
package main

import "fmt"

// (int, int) — ikkita butun son qaytaradi
func calculate(n1 int, n2 int) (int, int) {
    sum := n1 + n2
    difference := n1 - n2

    return sum, difference
}

func main() {
    // Ikkala natijani alohida o'zgaruvchilarga qabul qilib olamiz
    sum, diff := calculate(21, 13)

    fmt.Println("Yig'indi:", sum)
    fmt.Println("Ayirma:", diff)
}

Natija:

kod
Yig'indi: 34
Ayirma: 8

5. Funksiyalardan foydalanishning afzalliklari

  1. Kodni qayta ishlatish (Code Reusability): Bir marta yozilgan funksiyani dasturning istalgan joyida qayta-qayta chaqirish mumkin.
    example.go
    func getSquare(num int) {
        fmt.Printf("%d ning kvadrati: %d\n", num, num*num)
    }
    
    func main() {
        getSquare(3)  // 9
        getSquare(5)  // 25
        getSquare(10) // 100
    }
    
  2. Kodni tushunarliligi va soddaligi (Code Readability): Murakkab vazifalar kichik bloklarga bo'linadi, natijada dasturni sinash va nosozliklarni bartaraf etish ancha osonlashadi.