Middle
Miks tühine liides Go-s võib muuta mis tahes tüübiks?
sobes.tech AI
Vastus AI-lt
Tühi liides interface{} ei sisalda meetodeid. Iga Go tüüp võib rahuldada meetodit nõudmata liidest. Seetõttu saab iga tüübi väärtuse omistada interface{} tüüpi muutujale või edasi anda funktsioonile, mis võtab vastu interface{}. Põhimõtteliselt on interface{} konteiner iga tüübi väärtuse jaoks, mis salvestab nii väärtuse kui ka selle tüübi.
package main
import "fmt"
func main() {
var i interface{} // Tühi liides muutujana
i = 42 // Omistame int
fmt.Printf("Väärtus: %v, Tüüp: %T\n", i, i)
i = "tere" // Omistame string
fmt.Printf("Väärtus: %v, Tüüp: %T\n", i, i)
i = true // Omistame bool
fmt.Printf("Väärtus: %v, Tüüp: %T\n", i, i)
i = struct{}{} // Omistame tühja struktuuri
fmt.Printf("Väärtus: %v, Tüüp: %T\n", i, i)
}
Konverteerimine interface{}-st konkreetseks tüübiks on võimalik kasutades tüübiväiteid (type assertion) või tüübivõrku (type switch).
package main
import "fmt"
func main() {
var i interface{} = "maailm"
// Tüübiväide
s, ok := i.(string) // kontrollib, kas väärtus on string
if ok {
fmt.Println("Tüübiväide õnnestus:", s)
} else {
fmt.Println("Tüübiväide ebaõnnestus")
}
// Tüübivõrk
switch v := i.(type) {
case int:
fmt.Println("Tüüp on int, väärtus:", v)
case string:
fmt.Println("Tüüp on string, väärtus:", v)
default:
fmt.Println("Tundmatu tüüp")
}
}