Middle
Защо празният интерфейс в Go може да бъде преобразуван към всеки тип?
sobes.tech AI
Отговор от AI
Празният интерфейс interface{} не съдържа методи. Всеки тип в Go може да удовлетвори интерфейс, който не изисква никакви методи. Затова стойността на всеки тип може да бъде присвоена на променлива от тип interface{} или да бъде предадена на функция, която приема interface{}. По същество, interface{} е контейнер за стойност от произволен тип, който съхранява както стойността, така и нейния тип.
package main
import "fmt"
func main() {
var i interface{} // Декларираме променлива от празен интерфейс
i = 42 // Присвояваме int
fmt.Printf("Стойност: %v, Тип: %T\n", i, i)
i = "здравей" // Присвояваме string
fmt.Printf("Стойност: %v, Тип: %T\n", i, i)
i = true // Присвояваме bool
fmt.Printf("Стойност: %v, Тип: %T\n", i, i)
i = struct{}{} // Присвояваме празна структура
fmt.Printf("Стойност: %v, Тип: %T\n", i, i)
}
Преобразуването от interface{} към конкретен тип е възможно чрез твърдение за тип (type assertion) или чрез switch за типове (type switch).
package main
import "fmt"
func main() {
var i interface{} = "свят"
// Твърдение за тип
s, ok := i.(string) // проверява дали стойността е string
if ok {
fmt.Println("Успешно твърдение за тип:", s)
} else {
fmt.Println("Твърдението за тип неуспешно")
}
// Switch за тип
switch v := i.(type) {
case int:
fmt.Println("Типът е int, стойност:", v)
case string:
fmt.Println("Типът е string, стойност:", v)
default:
fmt.Println("Непознат тип")
}
}