Maison  >  Article  >  développement back-end  >  Comment utiliser une énumération de chaîne avec une méthode comme paramètre générique ?

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

WBOY
WBOYavant
2024-02-10 14:21:17989parcourir

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()
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer