Ma’lumot turlari — Go’ning statik tipizatsiyasining asosi. Har bir o’zgaruvchi kompilyatsiya vaqtida qat’iy belgilangan turga ega, va Go, C++’dan farqli, turlar orasida hech qanday yashirin (implicit) o’girishga yo’l qo’ymaydi.
Ma’lumot turi — qiymatning xotirada qanday saqlanishini va u ustida qanday amal bajarish mumkinligini belgilaydigan tasnif. Go’da tur mos kelmasa, kompilyator kodni umuman qabul qilmaydi.
Asosiy sonli turlar
Go bir nechta aniq o’lchamli sonli turga ega. Ularni jadvalda ko’ramiz:
| Tur | Tavsifi | Diapazon (taxminiy) |
|---|---|---|
int |
platformaga bog’liq butun son | 32 yoki 64 bit |
int8, int16, int32, int64 |
aniq o’lchamli butun son | belgilangan bit soni |
uint8, uint16, uint32, uint64 |
manfiy bo’lmagan butun son | belgilangan bit soni |
float32, float64 |
kasr son | IEEE 754 |
bool |
mantiqiy | true / false |
string |
matn | UTF-8 baytlar ketma-ketligi |
Amaliyotda deyarli har doim oddiy int va float64 yetarli — aniq o’lchamli turlar faqat xotira yoki tarmoq protokoli talab qilgan hollarda kerak bo’ladi.
Yashirin o’girish yo’q
Go’da, hatto ikkita “yaqin” son turi (int va float64) orasida ham avtomatik o’girish sodir bo’lmaydi:
package main
import "fmt"
func main() {
var a int = 5
var b float64 = 2.5
fmt.Println(a + b)
}
# command-line-arguments
./main.go:8:14: invalid operation: a + b (mismatched types int and float64)
Kompilyator a + bni rad etdi — int va float64 mos kelmadi. Bunday holatda aniq o’girish shart:
package main
import "fmt"
func main() {
var a int = 5
var b float64 = 2.5
natija := float64(a) + b
fmt.Println(natija)
}
7.5
float64(a) — ani intdan float64ga aniq o’girdi. Bu qat’iylik xatolarni kompilyatsiya bosqichidayoq ushlab qoladi, ishga tushgandan keyin emas.
byte va rune — matn ichidagi ikki tur
Go’da matn bilan ishlashda ikkita maxsus alias tur uchraydi: byte (uint8ning taxallusi) va rune (int32ning taxallusi, bitta Unicode belgisini bildiradi):
package main
import "fmt"
func main() {
matn := "Go"
fmt.Printf("%T\n", matn[0])
fmt.Printf("%T\n", []rune(matn)[0])
fmt.Println(matn[0])
fmt.Println(string(matn[0]))
}
uint8
int32
71
G
matn[0] satrning birinchi baytini (uint8, ekranda son sifatida — 71, 'G' harfining ASCII kodi) qaytaradi, string(...) esa uni yana o’qiladigan belgiga o’giradi. Lotin harflari uchun bayt va belgi mos keladi, lekin ko’p baytli (masalan, kirill yoki o’zga alifbo) belgilarda bu farq muhim ahamiyat kasb etadi — shu sabab satr ustida chinakam belgi-bo’ylab yurish uchun runega o’girish tavsiya etiladi.
Turni tekshirish
Har qanday qiymatning turini %T format verbi orqali bilib olish mumkin (chiqarish darsida ko’rgan edik):
package main
import "fmt"
func main() {
narx := 15000.50
soni := 3
nomi := "Klaviatura"
fmt.Printf("%T %T %T\n", narx, soni, nomi)
}
float64 int string
Diqqat: literal 15000.50 avtomatik float64, 3 esa int deb xulosa qilindi — bu Go’ning standart (default) turlari, var yoki := orqali aniq boshqa tur ko’rsatilmasa shular ishlatiladi.