32 / 68

Type Assertions

Turni tasdiqlash

Go dasturlash tilida type assertions (turni tasdiqlash) interfeys ichida saqlanayotgan haqiqiy ma'lumotning turini aniqlash va uning asl qiymatini ajratib olish uchun ishlatiladi.

Biz bilamizki, bo'sh interfeys (interface{}) o'zida har qanday turdagi qiymatni saqlay oladi. Ammo interfeysdagi qiymat bilan matematik amallar yoki boshqa amallarni bajarish uchun uning aniq turini tiklash (tasdiqlash) talab etiladi.


1. Type Assertion sintaksisi

Interfeys o'zgaruvchisidan ma'lum bir turni ajratib olish quyidagicha yoziladi:

example.go
qiymat := a.(Tur)

Bu yerda (Tur) o'rniga biz kutayotgan aniq tur (int, string, float64 va h.k.) yoziladi.

Misol:

example.go
package main

import "fmt"

func main() {
    // Bo'sh interfeys yaratamiz
    var a interface{}

    // Unga butun son o'zlashtiramiz
    a = 10

    // Type assertion orqali int turini olamiz
    interfaceValue := a.(int)

    fmt.Println(interfaceValue) // 10
}

2. Noto'g'ri tur ko'rsatilganda Panic xatosi

Agar biz tekshirayotgan tur interfeys ichidagi haqiqiy turga to'g'ri kelmasa, dastur jiddiy panic xatosini beradi va o'z ishini to'xtatadi:

example.go
package main

import "fmt"

func main() {
    var a interface{} = "Golang" // aslida satr

    // Uni int deb tasdiqlashga urinamiz
    interfaceValue := a.(int)

    fmt.Println(interfaceValue)
}

Kompilyator/Dastur xatosi:

kod
panic: interface conversion: interface {} is string, not int

3. Panic xatosining oldini olish (comma-ok usuli)

Type assertion jarayonida panic sodir bo'lmasligi uchun Go ikkita qiymat qaytarish mexanizmini (comma-ok idiomasi) taqdim etadi:

  1. Asl qiymat (agar tur to'g'ri kelsa)
  2. Mantiqiy natija (true yoki false)
example.go
qiymat, ok := a.(Tur)

Agar tur to'g'ri kelsa, ok qiymati true bo'ladi. Agar tur mos kelmasa, dastur to'xtamaydi, balki ok qiymati false, o'zgaruvchi esa o'sha turning default qiymatini (masalan, int uchun 0) oladi:

example.go
package main

import "fmt"

func main() {
    var a interface{} = "Golang"

    // Ikkita o'zgaruvchi bilan qabul qilamiz
    value, ok := a.(int)

    fmt.Println("Qiymat:", value)
    fmt.Println("Tur to'g'rimi?:", ok)

    if ok {
        fmt.Println("a butun son:", value)
    } else {
        fmt.Println("a butun son emas!")
    }
}

Natija:

kod
Qiymat: 0
Tur to'g'rimi?: false
a butun son emas!

Shu tarzda ok tekshiruvi orqali istalgan interfeysdagi turni xavfsiz aniqlash mumkin.