Wie verwende ich eine String-Enumeration mit einer Methode als generischem Parameter?

WBOY
Freigeben: 2024-02-10 14:21:17
nach vorne
989 Leute haben es durchsucht

Wie verwende ich eine String-Enumeration mit einer Methode als generischem Parameter?

Der PHP-Editor Youzi ist hier, um Ihnen die Verwendung der String-Enumeration mit Methoden als generischen Parametern vorzustellen. Bei der Programmierung müssen wir häufig Generika verwenden, um die Flexibilität und Wiederverwendbarkeit von Code zu erhöhen. Die Verwendung von String-Aufzählungen mit Methoden als generische Parameter kann unseren Code prägnanter und effizienter machen. Als Nächstes erläutern wir die Implementierung dieser Funktion und geben konkreten Beispielcode. Lassen Sie uns gemeinsam diese interessante Programmiertechnik erkunden!

Frageninhalt

Ich habe mehrere von Zeichenfolgen abgeleitete Aufzählungen, die ein gemeinsames validate() 方法(全部超出我的控制范围)。我想要一个通用方法,将字符串转换为这些枚举,并在生成的枚举上调用 validate() haben. Ich habe versucht, dies mithilfe von Generika zu erreichen, bin aber aus verschiedenen Gründen gescheitert.

Im folgenden Beispiel ist die Typbeschränkung zu stark und hindert mich daran, die validate()。我还尝试使用 validate()-Methode aufzurufen, um meine eigene Schnittstelle einzufügen und sie als Typbeschränkung zu verwenden, schlägt dann aber beim Typkonvertierungsteil fehl.

Wie kann ich dies erreichen, ohne die Enumeration zu ändern?

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()
}
Nach dem Login kopieren

Workaround

Verwenden Sie Typeinschränkungen, die die string 基础类型 validate()-Methode angeben:

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
}
Nach dem Login kopieren

Testen Sie es:

result := stringtovalidatedenum[foostatusenum]("a")
fmt.printf("%t %v", result, result)
Nach dem Login kopieren

Dies wird ausgegeben (versuchen Sie es auf Go Playground):

main.FooStatusEnum A
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie verwende ich eine String-Enumeration mit einer Methode als generischem Parameter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!