Sobes.tech
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")
	}
}