L'absence de fonctionnalités génériques dans Go pose des défis lorsque l'on tente de généraliser les fonctionnalités. Un scénario courant est la nécessité d'une fonction générique de gestion des erreurs applicable à toute fonction renvoyant une valeur et une erreur.
L'exemple fourni montre une tentative de création d'une telle fonction à l'aide d'une interface vide :
<code class="go">func P(any interface{}, err error) (interface{}) { if err != nil { panic("error: "+ err.Error()) } return any }</code>
Bien que cette approche fonctionne pour la gestion des erreurs, elle perd les informations de type, laissant l'interface résultante vide.
Pour éviter le problème de perte d'informations de type, envisagez d'utiliser la génération de code pour créer des implémentations spécialisées de la fonction de gestion des erreurs pour différents types. Ceci peut être réalisé à l'aide d'outils tels que "go generate", "gengen", "genny" ou "gen".
Par exemple, en utilisant "gen", vous pouvez définir un modèle :
<code class="text">// template.go package main import "fmt" func P[T any](v T, err error) (T) { if err != nil { panic(fmt.Sprintf("error: %v", err)) } return v }</code>
Ce modèle peut être utilisé pour générer des implémentations spécifiques au type de P() :
<code class="sh">gen generate</code>
Cela créera des implémentations telles que comme :
<code class="go">// p_int.go package main func PInt(v int, err error) (int) { if err != nil { panic(fmt.Sprintf("error: %v", err)) } return v }</code>
En utilisant ces fonctions générées, les informations de type sont préservées et la gestion des erreurs peut être appliquée de manière transparente à des types spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!