22 / 68

Variable Scope

O'zgaruvchilar ko'rinish sohasi

Go dasturlash tilida ko'rinish sohasi (scope) — bu dasturning o'zgaruvchiga to'g'ridan-to'g'ri murojaat qilish mumkin bo'lgan hududini belgilaydi.

Ko'rinish sohasiga qarab o'zgaruvchilar ikki turga bo'linadi:

  1. Mahalliy o'zgaruvchilar (Local Variables)
  2. Global o'zgaruvchilar (Global Variables)

1. Mahalliy o'zgaruvchilar (Local Variables)

Funksiya yoki biror blok ({}) ichida e'lon qilingan o'zgaruvchilar mahalliy (local) hisoblanadi. Ularga faqat o'sha funksiya yoki blok ichidagina murojaat qilish mumkin, funksiyadan tashqarida ularga murojaat qilish xatolikka olib keladi.

example.go
package main

import "fmt"

func addNumbers() {
    // Mahalliy o'zgaruvchi
    var sum int
    sum = 5 + 9
}

func main() {
    addNumbers()

    // Xatolik! sum o'zgaruvchisiga addNumbers() tashqarisidan kirib bo'lmaydi
    fmt.Println("Sum is", sum)
}

Kompilyator xatosi:

kod
undefined: sum

Bu muammoni hal qilish uchun qiymatni funksiyadan return orqali qaytarish yoki o'zgaruvchini global qilish kerak.


2. Global o'zgaruvchilar (Global Variables)

Barcha funksiyalardan tashqarida (package darajasida) e'lon qilingan o'zgaruvchilar global o'zgaruvchilar deyiladi. Ulardan butun dasturning istalgan joyida (barcha funksiyalar ichida) foydalanish mumkin:

example.go
package main

import "fmt"

// Global o'zgaruvchi
var sum int

func addNumbers() {
    sum = 9 + 5
}

func main() {
    addNumbers()

    // Global sum o'zgaruvchisini bemalol o'qiy olamiz
    fmt.Println("Yig'indi:", sum)
}

Natija:

kod
Yig'indi: 14

3. O'zgaruvchilarning boshlang'ich (Default) qiymatlari

Goda mahalliy yoki global o'zgaruvchiga dastlab qiymat berilmasa, u o'z turiga mos standart (default) qiymatni oladi:

  • int, float32, float64 uchun: 0
  • string uchun: "" (bo'sh satr)
  • bool uchun: false
example.go
package main

import "fmt"

// Global o'zgaruvchi
var variable1 int

func defaultValues() {
    // Mahalliy o'zgaruvchi
    var variable2 float32

    fmt.Println(variable1) // 0
    fmt.Println(variable2) // 0
}

func main() {
    defaultValues()
}

4. O'zgaruvchilar ustuvorligi (Mahalliy vs Global)

Agar bir xil nomli global va mahalliy o'zgaruvchi mavjud bo'lsa, funksiya ichida kompilyator har doim mahalliy (local) o'zgaruvchiga ustuvorlik beradi:

example.go
package main

import "fmt"

// Global o'zgaruvchi
var random = "Global"

func main() {
    // Xuddi shu nomdagi mahalliy o'zgaruvchi
    var random = "Local"

    fmt.Println(random)
}

Natija:

kod
Local

Bu yerda mahalliy random o'zgaruvchisi global random o'zgaruvchisini to'sib (soya qilib — shadowing) qo'ydi.


5. Nega global o'zgaruvchilardan ko'p foydalanish tavsiya etilmaydi?

Ko'p hollarda global o'zgaruvchilarni haddan tashqari ko'p ishlatish yomon amaliyot (bad practice) sanaladi:

  1. Global o'zgaruvchini dasturning istalgan joyidagi istalgan funksiya o'zgartirishi mumkin.
  2. Natijada boshqa funksiyalar qiymat qachon va qayerda o'zgarganini bilmay qoladi va chalkashliklar, kutilmagan xatolar (side effects) kelib chiqadi.
example.go
package main

import "fmt"

var temperature float32 = 35

func findTemp1() {
    temperature = 43
}

func findTemp2() {
    temperature = 29
}

func main() {
    fmt.Println("Boshlang'ich:", temperature) // 35
    findTemp1()
    fmt.Println("findTemp1 dan so'ng:", temperature) // 43
    findTemp2()
    fmt.Println("findTemp2 dan so'ng:", temperature) // 29
}

Katta loyihalarda bu kabi nojo'ya o'zgarishlarni topish juda qiyinlashadi, shuning uchun ma'lumotlarni funksiyalarga argument sifatida uzatish va return orqali qabul qilib olish tavsiya etiladi.