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.
Interfeys o'zgaruvchisidan ma'lum bir turni ajratib olish quyidagicha yoziladi:
qiymat := a.(Tur)
Bu yerda (Tur) o'rniga biz kutayotgan aniq tur (int, string, float64 va h.k.) yoziladi.
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
}
Agar biz tekshirayotgan tur interfeys ichidagi haqiqiy turga to'g'ri kelmasa, dastur jiddiy panic xatosini beradi va o'z ishini to'xtatadi:
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:
panic: interface conversion: interface {} is string, not int
comma-ok usuli)Type assertion jarayonida panic sodir bo'lmasligi uchun Go ikkita qiymat qaytarish mexanizmini (comma-ok idiomasi) taqdim etadi:
true yoki false)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:
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:
Qiymat: 0
Tur to'g'rimi?: false
a butun son emas!
Shu tarzda ok tekshiruvi orqali istalgan interfeysdagi turni xavfsiz aniqlash mumkin.