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
- Assertions de type : gestion de type sûre et robuste
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 etok
commefalse
. 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.