Middle
¿Por qué la interfaz vacía en Go puede convertirse en cualquier tipo?
sobes.tech AI
Respuesta de la IA
La interfaz vacía interface{} no contiene métodos. Cualquier tipo en Go puede satisfacer una interfaz que no requiere ningún método. Por lo tanto, el valor de cualquier tipo puede asignarse a una variable de tipo interface{} o pasarse a una función que acepte interface{}. En esencia, interface{} es un contenedor para un valor de cualquier tipo, que almacena tanto el valor como su tipo.
package main
import "fmt"
func main() {
var i interface{} // Declaramos una variable de interfaz vacía
i = 42 // Asignamos un int
fmt.Printf("Valor: %v, Tipo: %T\n", i, i)
i = "hola" // Asignamos un string
fmt.Printf("Valor: %v, Tipo: %T\n", i, i)
i = true // Asignamos un bool
fmt.Printf("Valor: %v, Tipo: %T\n", i, i)
i = struct{}{} // Asignamos una estructura vacía
fmt.Printf("Valor: %v, Tipo: %T\n", i, i)
}
La conversión a un tipo específico desde interface{} es posible mediante afirmación de tipo (type assertion) o mediante una declaración de cambio de tipo (type switch).
package main
import "fmt"
func main() {
var i interface{} = "mundo"
// Afirmación de tipo
s, ok := i.(string) // Verifica si el valor es una cadena
if ok {
fmt.Println("Afirmación de tipo exitosa:", s)
} else {
fmt.Println("Fallo en afirmación de tipo")
}
// Declaración de cambio de tipo
switch v := i.(type) {
case int:
fmt.Println("El tipo es int, valor:", v)
case string:
fmt.Println("El tipo es string, valor:", v)
default:
fmt.Println("Tipo desconocido")
}
}