


Comment utiliser une énumération de chaîne avec une méthode comme paramètre générique ?
Feb 10, 2024 pm 02:21 PML'éditeur PHP Youzi est là pour vous présenter comment utiliser l'énumération de chaînes avec des méthodes comme paramètres génériques. En programmation, nous devons souvent utiliser des génériques pour augmenter la flexibilité et la réutilisabilité du code. L'utilisation d'énumérations de chaînes avec des méthodes comme paramètres génériques peut rendre notre code plus concis et efficace. Ensuite, nous expliquerons comment implémenter cette fonction et donnerons un exemple de code spécifique. Explorons ensemble cette technique de programmation intéressante !
Contenu de la question
J'ai plusieurs énumérations dérivées de chaînes qui partagent un validate()
方法(全部超出我的控制范围)。我想要一个通用方法,将字符串转换为这些枚举,并在生成的枚举上调用 validate()
commun. J'ai essayé d'utiliser des génériques pour y parvenir, mais j'ai échoué pour diverses raisons.
Dans l'exemple ci-dessous, la contrainte de type est trop forte et cela m'empêche d'appeler la méthode validate()
。我还尝试使用 validate()
pour insérer ma propre interface et l'utiliser comme contrainte de type, mais échoue ensuite sur la partie conversion de type.
Comment puis-je y parvenir sans modifier l'énumération ?
package main // imagine i have multiple of those types outside of my control type FooStatusEnum string func NewFooStatusEnum(value FooStatusEnum) *FooStatusEnum { return &value } const ( FooStatusEnumA FooStatusEnum = "A" FooStatusEnumB FooStatusEnum = "B" FooStatusEnumC FooStatusEnum = "C" ) func (m FooStatusEnum) Validate() error { return nil } func stringToValidatedEnum[E ~string](s string) E { e := E(s) if err := e.Validate(); err != nil { panic(1) } return e } func main() { stringToValidatedEnum[FooStatusEnum]("A") e := FooStatusEnum("A") e.Validate() }
Solution de contournement
Utilisez des contraintes de type spécifiant la méthode string
基础类型和 validate()
:
type enumstring interface { ~string validate() error } func stringtovalidatedenum[e enumstring](s string) e { e := e(s) if err := e.validate(); err != nil { panic(1) } return e }
Testez-le :
result := stringtovalidatedenum[foostatusenum]("a") fmt.printf("%t %v", result, result)
Cela affichera (essayez-le sur go terrain de jeu) :
main.FooStatusEnum A
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement?

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego?

Comment écrire des objets et des talons simulés pour les tests en Go?

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO?

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go?

Comment rédigez-vous des tests unitaires en Go?

Comment écrire des fichiers dans GO Language de manière pratique?

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go?
