Middle
Kodėl tuščias interfeisas Go gali būti paverstas į bet kurį tipą?
sobes.tech AI
Atsakymas iš AI
Tuščias sąsaja interface{} neapima jokių metodų. Bet kuris tipas Go gali patenkinti sąsają, kuri nereikalauja jokių metodų. Todėl bet kurio tipo reikšmė gali būti priskirta interface{} tipo kintamajam arba perduota funkcijai, kuri priima interface{}. Esmė ta, kad interface{} yra konteineris bet kokio tipo reikšmei, saugantis tiek reikšmę, tiek jos tipą.
package main
import "fmt"
func main() {
var i interface{} // Tuščios sąsajos deklaravimas
i = 42 // priskiriame int
fmt.Printf("Reikšmė: %v, Tipas: %T\n", i, i)
i = "labas" // priskiriame string
fmt.Printf("Reikšmė: %v, Tipas: %T\n", i, i)
i = true // priskiriame bool
fmt.Printf("Reikšmė: %v, Tipas: %T\n", i, i)
i = struct{}{} // priskiriame tuščią struktūrą
fmt.Printf("Reikšmė: %v, Tipas: %T\n", i, i)
}
Konvertuoti iš interface{} į konkretų tipą galima naudojant tipo teiginį (type assertion) arba tipo perjungimą (type switch).
package main
import "fmt"
func main() {
var i interface{} = "pasaulis"
// Tipo teiginys
s, ok := i.(string) // patikrina, ar reikšmė yra string
if ok {
fmt.Println("Sėkmingas tipo teiginys:", s)
} else {
fmt.Println("Nepavyko atlikti tipo teiginio")
}
// Tipo perjungimas
switch v := i.(type) {
case int:
fmt.Println("Tipas yra int, reikšmė:", v)
case string:
fmt.Println("Tipas yra string, reikšmė:", v)
default:
fmt.Println("Nežinomas tipas")
}
}