L'absence de fonctionnalités génériques dans Go pose des problèmes 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 :
func P(any interface{}, err error) (interface{}) {
if err != nil {
panic("error: " err.Error())
}
return any
}
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 informations de type perdues, 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 :
// 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
}
Ce modèle peut être utilisé pour générer des implémentations spécifiques au type de P() :
gen generate
Cela créera des implémentations telles que :
// p_int.go
package main
func PInt(v int, err error) (int) {
if err != nil {
panic(fmt.Sprintf("error: %v", err))
}
return v
}
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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3