Assertions de type
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 17 sur 68.
Lorsque vous travaillez avec des variables d'interface, vous avez souvent besoin d'accéder à la valeur concrète réelle stockée à l'intérieur. C'est là que les assertions de type interviennent : elles vous permettent d'extraire et d'utiliser la valeur sous-jacente en toute sécurité.
Une assertion de type utilise cette syntaxe : value, ok := interfaceVariable.(Type). La première valeur de retour est la valeur extraite du type spécifié, et la seconde est un booléen qui vous indique si l'assertion a réussi.
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}La variable ok est cruciale pour la sécurité. Si vous essayez d'affirmer le mauvais type, ok sera false, et value sera la valeur zéro de ce type. Sans vérifier ok, une assertion de type échouée provoquerait un panic de votre programme.
Les assertions de type sont essentielles lors de l'utilisation de valeurs interface{}, vous permettant de convertir l'interface générique en un type spécifique afin de pouvoir utiliser ses méthodes et ses opérations.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Défi
FacileDans ce défi, vous allez vous entraîner à utiliser les assertions de type pour extraire et manipuler en toute sécurité des valeurs concrètes à partir de variables d'interface. Vous allez créer un analyseur de données qui traite différents types de valeurs stockées dans des interfaces vides.
Vous recevrez deux entrées :
- Une chaîne de caractères représentant le type de données à vérifier (par exemple,
"int","string", ou"bool") - Une chaîne de caractères représentant la valeur réelle (par exemple,
"42","hello", ou"true")
Votre tâche consiste à :
- Convertir la chaîne de valeur vers le type Go approprié et la stocker dans une variable
interface{}:- Pour
"int": convertir en entier - Pour
"string": utiliser comme chaîne de caractères - Pour
"bool": convertir en booléen
- Pour
- Utiliser l'assertion de type pour vérifier si la variable d'interface contient le type attendu spécifié dans la première entrée
- Si l'assertion de type réussit, affichez :
"Success: [value] is a [type]" - Si l'assertion de type échoue, affichez :
"Failed: value is not a [type]"
Vous devez utiliser la syntaxe d'assertion de type sécurisée avec la variable ok pour vérifier si l'assertion a réussi. Le défi teste votre compréhension de la manière d'extraire en toute sécurité des valeurs concrètes des variables d'interface sans provoquer de panique dans votre programme.
Pour la conversion booléenne, "true" doit être converti en true et toute autre chaîne doit être convertie en false. Utilisez le package strconv pour la conversion de chaîne en entier.
Aide-mémoire
Les assertions de type vous permettent d'extraire des valeurs concrètes de variables d'interface en utilisant la syntaxe value, ok := interfaceVariable.(Type) :
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}La variable ok indique si l'assertion a réussi. Si elle est fausse, value sera la valeur zéro de ce type. Vérifiez toujours ok pour éviter les panics suite à des assertions échouées.
Essayez vous-même
package main
import (
"fmt"
"strconv"
)
func main() {
// Lire l'entrée
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// Variable pour stocker la valeur de l'interface
var interfaceValue interface{}
// TODO: Écrivez votre code ci-dessous
// 1. Convertir valueStr au type approprié en fonction de dataType et stocker dans interfaceValue
// 2. Utiliser l'assertion de type pour vérifier si interfaceValue contient le type attendu
// 3. Imprimer le message de succès ou d'échec approprié
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements