08 / 68

Type Casting

Ma'lumot turlarini o'zgartirish

Tur o'zgartirish (Type casting) — bu bir ma'lumot turidagi (masalan, butun son, o'nlik kasr) qiymatni boshqa ma'lumot turiga o'tkazish jarayonidir.

Masalan:

example.go
// float turidagi o'zgaruvchi
var floatValue float32 = 9.8

// float ni int ga o'zgartiramiz
var intValue int = int(floatValue)

Bu yerda int(floatValue) ifodasi 9.8 kasr sonini butun son — 9 ga aylantiradi.

[!NOTE] Go dasturlash tilida tur o'zgartirish har doim dasturchi tomonidan qo'lda (oshkora) ko'rsatilishi shart. Bu oshkora tur o'zgartirish (explicit type casting) deb ataladi.

Go tili buning uchun int(), float32(), float64(), string() kabi o'rnatilgan funksiyalarni taqdim etadi.


1. Float turidan Int turiga o'tkazish

Haqiqiy (kasrli) sonni butun songa aylantirganda, uning nuqtadan keyingi barcha kasr qismi tashlab yuboriladi (yaxlitlanmaydi, balki kesib tashlanadi):

example.go
package main

import "fmt"

func main() {
    var floatValue float32 = 5.45

    // float32 dan int ga o'zgartirish
    var intValue int = int(floatValue)

    fmt.Printf("Float qiymat: %g\n", floatValue)
    fmt.Printf("Integer qiymat: %d\n", intValue)
}

Natija:

kod
Float qiymat: 5.45
Integer qiymat: 5

Bu yerda int() funksiyasi 5.45 qiymatini 5 ga aylantirdi.


2. Int turidan Float turiga o'tkazish

Butun sonni o'nlik kasr songa o'tkazish uchun float32() yoki float64() funksiyalaridan foydalanamiz:

example.go
package main

import "fmt"

func main() {
    var intValue int = 2

    // int dan float32 ga o'tkazamiz
    var floatValue float32 = float32(intValue)

    fmt.Printf("Integer qiymat: %d\n", intValue)
    fmt.Printf("Float qiymat: %f\n", floatValue)
}

Natija:

kod
Integer qiymat: 2
Float qiymat: 2.000000

float32(intValue) chaqiruvidan so'ng butun son 2 kasrli son 2.000000 ko'rinishiga o'tdi.


3. Goda yashirin (Implicit) tur o'zgartirish mavjud emas

Ba'zi dasturlash tillarida (masalan, JavaScript yoki C/C++) bir turdagi qiymat ikkinchi turga avtomatik (yashirin) o'tishi mumkin.

Biroq Go tili yashirin tur o'zgartirishni qo'llab-quvvatlamaydi. Go — qat'iy tiplashtirilgan (strongly-typed) til bo'lib, xatoliklarni oldini olish maqsadida barcha tur o'zgartirishlar aniq ko'rsatilishini talab qiladi.

Masalan:

example.go
package main

import "fmt"

func main() {
    // int turidagi o'zgaruvchiga float qiymat biriktirishga urinish
    var number int = 4.34
    fmt.Println(number)
}

Ushbu dastur kompilyatsiya vaqtidayoq xato beradi:

kod
constant 4.34 truncated to integer

4. Turli ma'lumot turlarini bir-biriga qo'shish

Go tilida turli xil ma'lumot turlaridagi (masalan, int va float32) o'zgaruvchilarni to'g'ridan-to'g'ri qo'shib bo'lmaydi:

example.go
package main

import "fmt"

func main() {
    var number1 int = 20
    var number2 float32 = 5.7

    // Xato! number1 va number2 ning turlari har xil:
    // var sum = number1 + number2
}

Bunday amallarni bajarish uchun avval ulardan birini ikkinchisining turiga o'tkazib olishimiz shart:

example.go
package main

import "fmt"

func main() {
    var number1 int = 20
    var number2 float32 = 5.7
    var sum float32

    // number1 (int) ni float32 ga o'tkazib, keyin qo'shamiz
    sum = float32(number1) + number2

    fmt.Printf("Yig'indi: %g\n", sum)
}

Natija:

kod
Yig'indi: 25.7

[!TIP] Tur o'zgartirishda har doim ma'lumot yo'qotilishi mumkinligini inobatga oling. float dan int ga o'tishda kasr qism butunlay yo'qoladi, katta sonlarni kichikroq o'lchamli turlarga (masalan, int64 dan int8 ga) o'tkazishda esa to'lib toshish (overflow) ro'y berishi mumkin.