Go Programming

Maîtriser l’inspection des types à l’exécution en Go

Spread the love

Go, étant typé statiquement, révèle généralement les types de variables au moment de la compilation. Cependant, des situations nécessitent une détermination du type à l’exécution. Cet article détaille deux méthodes : l’utilisation de la mise en forme de chaînes de caractères et l’emploi d’assertions de type.

Table des matières

Mise en forme des chaînes de caractères pour l’inspection de type

La façon la plus simple d’identifier le type d’un objet Go est d’utiliser la mise en forme de chaînes de caractères avec le package fmt. Le verbe %T dans fmt.Printf révèle le type.


package main

import "fmt"

func main() {
	var myInt int = 10
	var myFloat float64 = 3.14
	var myString string = "Hello, Go!"
	var myBool bool = true

	fmt.Printf("Le type de myInt est : %Tn", myInt)
	fmt.Printf("Le type de myFloat est : %Tn", myFloat)
	fmt.Printf("Le type de myString est : %Tn", myString)
	fmt.Printf("Le type de myBool est : %Tn", myBool)
}

Ceci affiche :


Le type de myInt est : int
Le type de myFloat est : float64
Le type de myString est : string
Le type de myBool est : bool

Bien que pratique pour le débogage, cette approche est limitée ; elle ne facilite pas le contrôle de flux basé sur le type à l’exécution.

Assertions de type : gestion de type sûre et robuste

Pour une vérification et une manipulation de type avancées, les assertions de type de Go sont indispensables. Elles permettent de vérifier si une interface contient un type spécifique et, le cas échéant, de récupérer sa valeur sous-jacente. Ceci est crucial lorsqu’on traite des interfaces, permettant le polymorphisme.


package main

import "fmt"

func main() {
	var myInterface interface{} = 10

	// Assertion de type sûre
	if value, ok := myInterface.(int); ok {
		fmt.Printf("La valeur est un entier : %dn", value)
	} else {
		fmt.Println("La valeur n'est pas un entier")
	}

	myInterface = "Hello, Go!"

	// Assertion de type non sûre (provoquera une panique si le type est incorrect)
    stringValue := myInterface.(string)
    fmt.Printf("La valeur de la chaîne est : %sn", stringValue)

	myInterface = 3.14

    // Exemple utilisant une instruction switch pour plusieurs types
    switch v := myInterface.(type) {
    case int:
        fmt.Printf("Valeur entière : %vn", v)
    case string:
        fmt.Printf("Valeur chaîne : %vn", v)
    case float64:
        fmt.Printf("Valeur float64 : %vn", v)
    default:
        fmt.Printf("Type inconnu : %Tn", v)
    }
}

Cet exemple illustre :

  • Assertion sûre (value, ok := myInterface.(int)) : Vérifie le type ; ok indique le succès. Un échec donne la valeur zéro pour le type et ok comme false. Empêche les paniques.
  • Assertion non sûre (myInterface.(string)) : Affirme directement le type. Échoue avec une panique à l’exécution si le type est incorrect. À utiliser avec une extrême prudence.
  • Instruction switch : Gère élégamment plusieurs types potentiels.

En résumé, tandis que fmt.Printf avec %T offre une inspection rapide du type pendant le développement, les assertions de type fournissent le mécanisme robuste pour la gestion dynamique des types dans le code de production. Priorisez la sécurité — utilisez l’idiome ok pour éviter les paniques à l’exécution.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *