Sobes.tech
Middle

Pourquoi une interface vide en Go peut-elle être convertie en n'importe quel type?

sobes.tech IA

Réponse de l'IA

L'interface vide interface{} ne contient pas de méthodes. Tout type en Go peut satisfaire une interface qui ne requiert aucune méthode. Par conséquent, la valeur de n'importe quel type peut être assignée à une variable de type interface{} ou passée à une fonction acceptant interface{}. En substance, interface{} est un conteneur pour une valeur de n'importe quel type, stockant à la fois la valeur elle-même et son type.

package main

import "fmt"

func main() {
	var i interface{} // Déclarons une variable d'interface vide

	i = 42            // Assignons un int
	fmt.Printf("Valeur : %v, Type : %T\n", i, i)

	i = "bonjour"   // Assignons un string
	fmt.Printf("Valeur : %v, Type : %T\n", i, i)

	i = true          // Assignons un bool
	fmt.Printf("Valeur : %v, Type : %T\n", i, i)

	i = struct{}{}    // Assignons une structure vide
	fmt.Printf("Valeur : %v, Type : %T\n", i, i)
}

La conversion vers un type spécifique depuis interface{} est possible via assertion de type (type assertion) ou via un switch de type (type switch).

package main

import "fmt"

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

	// Assertion de type
	s, ok := i.(string) // Vérifie si la valeur est une chaîne
	if ok {
		fmt.Println("Assertion de type réussie :", s)
	} else {
		fmt.Println("Échec de l'assertion de type")
	}

	// Switch de type
	switch v := i.(type) {
	case int:
		fmt.Println("Le type est int, valeur :", v)
	case string:
		fmt.Println("Le type est string, valeur :", v)
	default:
		fmt.Println("Type inconnu")
	}
}