Darsliklar Go Lang Ma'lumot turlari

Go Lang Go Lang Ma'lumot turlari

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 turiqiymatning 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.