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