Middle
Zašto se prazni interfejs u Go može pretvoriti u bilo koji tip?
sobes.tech АИ
Одговор од АИ
Prazan interfejs interface{} ne sadrži metode. Bilo koji tip u Go može zadovoljiti interfejs koji ne zahteva nikakve metode. Zbog toga, vrednost bilo kog tipa može biti dodeljena promenljivoj tipa interface{} ili prosleđena funkciji koja prihvata interface{}. U suštini, interface{} je kontejner za vrednost bilo kog tipa, koji čuva i vrednost i njen tip.
package main
import "fmt"
func main() {
var i interface{} // Deklarisemo promenljivu praznog interfejsa
i = 42 // Dodeljujemo int
fmt.Printf("Vrednost: %v, Tip: %T\n", i, i)
i = "zdravo" // Dodeljujemo string
fmt.Printf("Vrednost: %v, Tip: %T\n", i, i)
i = true // Dodeljujemo bool
fmt.Printf("Vrednost: %v, Tip: %T\n", i, i)
i = struct{}{} // Dodeljujemo prazan strukturu
fmt.Printf("Vrednost: %v, Tip: %T\n", i, i)
}
Prevod sa interface{} na konkretan tip je moguć pomoću tvrdnje o tipu (type assertion) ili switcha o tipu (type switch).
package main
import "fmt"
func main() {
var i interface{} = "svet"
// Tvrdnja o tipu
s, ok := i.(string) // proverava da li je vrednost string
if ok {
fmt.Println("Uspela tvrdnja o tipu:", s)
} else {
fmt.Println("Neuspešna tvrdnja o tipu")
}
// Switch o tipu
switch v := i.(type) {
case int:
fmt.Println("Tip je int, vrednost:", v)
case string:
fmt.Println("Tip je string, vrednost:", v)
default:
fmt.Println("Nepoznat tip")
}
}