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:
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.
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:
undefined: sum
Bu muammoni hal qilish uchun qiymatni funksiyadan return orqali qaytarish yoki o'zgaruvchini global qilish kerak.
Barcha funksiyalardan tashqarida (package darajasida) e'lon qilingan o'zgaruvchilar global o'zgaruvchilar deyiladi. Ulardan butun dasturning istalgan joyida (barcha funksiyalar ichida) foydalanish mumkin:
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:
Yig'indi: 14
Goda mahalliy yoki global o'zgaruvchiga dastlab qiymat berilmasa, u o'z turiga mos standart (default) qiymatni oladi:
int, float32, float64 uchun: 0string uchun: "" (bo'sh satr)bool uchun: falsepackage 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()
}
Agar bir xil nomli global va mahalliy o'zgaruvchi mavjud bo'lsa, funksiya ichida kompilyator har doim mahalliy (local) o'zgaruvchiga ustuvorlik beradi:
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:
Local
Bu yerda mahalliy random o'zgaruvchisi global random o'zgaruvchisini to'sib (soya qilib — shadowing) qo'ydi.
Ko'p hollarda global o'zgaruvchilarni haddan tashqari ko'p ishlatish yomon amaliyot (bad practice) sanaladi:
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.