L'identifiant vierge (_) est un identifiant spécial en Go, utilisé pour ignorer des valeurs. Il est utilisé lorsque la valeur retournée par une fonction n'est pas nécessaire, lors de l'importation de packages uniquement pour appeler leurs init, ou lors de l'implémentation d'interfaces.
Exemples :
// Ignorer la valeur de retour de l'erreur data, _ := ioutil.ReadFile("file.txt") // Importer un package uniquement pour ses effets secondaires import _ "net/http/pprof"
De plus, l'identifiant vierge aide lors de l'implémentation d'une interface sans utiliser explicitement tous les méthodes :
var _ io.Reader = (*MyReader)(nil) // la compilation échouera si le type n'implémente pas l'interface
Peut-on utiliser l'identifiant vierge pour supprimer en permanence les erreurs ? Est-ce une pratique sûre ?
Réponse : Non. Bien que l'identifiant vierge permette d'ignorer une erreur, ce n'est pas une pratique sûre — ignorer les erreurs conduit souvent à des bogues fatals ou à un fonctionnement incorrect du programme. Il est toujours nécessaire de traiter les erreurs de manière consciente et d'utiliser l'identifiant vierge pour les supprimer uniquement dans des endroits clairs (par exemple, ceux qui sont manifestement insignifiants pour la logique).
Histoire
Dans une application de gestion de fichiers, le développeur a utilisé partout la construction _, _ = file.Write(...), ignorant les erreurs d'écriture. En conséquence, lors d'un remplissage du disque ou d'un échec d'écriture, le programme continuait de fonctionner « comme si tout allait bien », entraînant une perte de données.
Histoire
Dans un projet d'audit, l'auditeur pensait que si une fonction renvoyait une erreur, elle devait toujours être supprimée (_). En conséquence, les erreurs lors de l'enregistrement des logs d'actions n'ont pas été remarquées lors des tests — des données importantes étaient perdues, et la raison n'était pas claire.
Histoire
Un étudiant, apprenant Go, a utilisé l'identifiant vierge lors de l'importation de plusieurs packages tiers, bien que cela n'ait pas été nécessaire. En conséquence, la taille du fichier binaire a presque doublé, car tous les effets secondaires des packages ont été inclus dans l'application finale.