Sobes.tech
Middle

Kāpēc tukšā interfeisa Go var pārvērst jebkurā tipā?

sobes.tech AI

Atbilde no AI

Tukša saskarne interface{} nesatur metodes. Jebkurš tips Go var būt apmierinošs ar jebkuru metodi nepieprasošu saskarni. Tādēļ jebkura tipa vērtība var tikt piešķirta interface{} tipa mainīgajam vai nodota funkcijai, kas pieņem interface{}. Pamatā, interface{} ir konteineris jebkura tipa vērtībai, kas glabā gan vērtību, gan tās tipu.

package main

import "fmt"

func main() {
	var i interface{} // Deklarējam tukšu saskarni

	i = 42            // Piešķiram int
	fmt.Printf("Vērtība: %v, Tips: %T\n", i, i)

	i = "sveiki"    // Piešķiram string
	fmt.Printf("Vērtība: %v, Tips: %T\n", i, i)

	i = true        // Piešķiram bool
	fmt.Printf("Vērtība: %v, Tips: %T\n", i, i)

	i = struct{}{}  // Piešķiram tukšu struktūru
	fmt.Printf("Vērtība: %v, Tips: %T\n", i, i)
}

Konvertēt no interface{} uz konkrētu tipu ir iespējams ar tipu apgalvojumu (type assertion) vai tipu pārslēgšanu (type switch).

package main

import "fmt"

func main() {
	var i interface{} = "pasaule"

	// Tipa apgalvojums
	s, ok := i.(string) // pārbauda, vai vērtība ir string
	if ok {
		fmt.Println("Veiksmīgs tipa apgalvojums:", s)
	} else {
		fmt.Println("Tipa apgalvojums neizdevās")
}

	// Tipu pārslēgšana
	switch v := i.(type) {
	case int:
		fmt.Println("Tips ir int, vērtība:", v)
	case string:
		fmt.Println("Tips ir string, vērtība:", v)
	default:
		fmt.Println("Nezināms tips")
	}
}