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