Maison > développement back-end > Golang > le corps du texte

Comment utiliser une énumération de chaîne avec une méthode comme paramètre générique ?

WBOY
Libérer: 2024-02-10 14:21:17
avant
987 Les gens l'ont consulté

Comment utiliser une énumération de chaîne avec une méthode comme paramètre générique ?

L'é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()
}
Copier après la connexion

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
}
Copier après la connexion

Testez-le :

result := stringtovalidatedenum[foostatusenum]("a")
fmt.printf("%t %v", result, result)
Copier après la connexion

Cela affichera (essayez-le sur go terrain de jeu) :

main.FooStatusEnum A
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!