Darsliklar Go Lang Konstantalar

Go Lang Go Lang Konstantalar

Konstanta — dastur ishlashi davomida o’zgarmaydigan qiymat. Go’da konstantalar const kalit so’zi bilan e’lon qilinadi va, oddiy o’zgaruvchidan farqli, qiymati albatta kompilyatsiya vaqtida ma’lum bo’lishi shart.

consto’zgarmas qiymatni e’lon qiluvchi kalit so’z. Go’dagi konstanta funksiya natijasidan emas, faqat kompilyatsiya vaqtida hisoblanadigan ifodadan olinishi mumkin.

Oddiy konstanta

Konstanta var bilan deyarli bir xil yoziladi, faqat qiymatini keyinroq o’zgartirib bo’lmaydi:

package main

import "fmt"

func main() {
    const Pi = 3.14159
    fmt.Println(Pi)
}
3.14159

Piga qayta qiymat berishga urinish (Pi = 3.14) kompilyatsiya xatosiga olib keladi — Go bunga umuman yo’l qo’ymaydi, vardagi kabi ijro paytida emas.

Konstantalar bloki va iota

Bir nechta bog’liq konstantani sanab chiqish uchun Go’ning o’ziga xos iota hisoblagichi ishlatiladi — u har yangi qatorda avtomatik 1ga oshadi:

package main

import "fmt"

const (
    Dushanba = iota
    Seshanba
    Chorshanba
    Payshanba
    Juma
)

func main() {
    fmt.Println(Dushanba, Seshanba, Chorshanba, Payshanba, Juma)
}
0 1 2 3 4

iota blok boshida 0dan boshlanadi va har qator uchun avtomatik 1ga ortadi. Qiymat qatorlarda takrorlanmagani uchun (Seshanba, Chorshanba va h.k. hech qanday qiymat yozmagan), Go oldingi qatordagi ifodani avtomatik takrorlaydi — bu Go’ning boshqa tillardagi enumga eng yaqin muqobili.

iota bilan hisoblash

iotani oddiy sanashdan tashqari, undan foydalanib formulalar orqali qiymat hosil qilish ham mumkin — bu, masalan, ikkilik butun songa asoslangan bayroqlar (bit flags) yaratishda qo’llaniladi:

package main

import "fmt"

const (
    KB = 1 << (10 * (iota + 1))
    MB
    GB
)

func main() {
    fmt.Println(KB, MB, GB)
}
1024 1048576 1073741824

1 << (10 * (iota + 1))iota=0 bo’lganda 1 << 10 (1024, ya’ni 1 KB), iota=1 bo’lganda 1 << 20 (1 MB) va hokazo. Har bir keyingi konstanta oldingi formulani, faqat yangilangan iota bilan, avtomatik qayta hisoblaydi.

Typed va untyped konstanta

Go’ning nozik jihati: turi ko’rsatilmagan konstanta (untyped) kontekstga qarab moslashadi, aniq turdagi o’zgaruvchiga esa qat’iy tekshiruvdan so’ng joylashadi:

package main

import "fmt"

const Son = 100

func main() {
    var butun int32 = Son
    var kasr float64 = Son

    fmt.Println(butun, kasr)
}
100 100

Son — turi yozilmagan (untyped) konstanta, shuning uchun u ham int32ga, ham float64ga hech qanday aniq o’girishsiz joylashdi. Agar Son var Son int = 100 deb, turi aniq ko’rsatilgan holda e’lon qilinganida, var kasr float64 = Son xato berardi — xuddi oddiy o’zgaruvchilar orasidagi mos kelmaslik kabi.