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.
const — o’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.