Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menggunakan rentetan enum dengan kaedah sebagai parameter generik?

Bagaimana untuk menggunakan rentetan enum dengan kaedah sebagai parameter generik?

WBOY
WBOYke hadapan
2024-02-10 14:21:171023semak imbas

Bagaimana untuk menggunakan rentetan enum dengan kaedah sebagai parameter generik?

Editor PHP Youzi di sini untuk memperkenalkan cara menggunakan penghitungan rentetan dengan kaedah sebagai parameter generik. Dalam pengaturcaraan, kita selalunya perlu menggunakan generik untuk meningkatkan fleksibiliti dan kebolehgunaan semula kod. Menggunakan penghitungan rentetan dengan kaedah sebagai parameter generik boleh menjadikan kod kami lebih ringkas dan cekap. Seterusnya, kami akan menghuraikan cara melaksanakan fungsi ini dan memberikan kod contoh khusus. Mari kita terokai teknik pengaturcaraan yang menarik ini bersama-sama!

Kandungan soalan

Saya mempunyai beberapa penghitungan terbitan rentetan yang berkongsi persamaan validate() 方法(全部超出我的控制范围)。我想要一个通用方法,将字符串转换为这些枚举,并在生成的枚举上调用 validate() . Saya cuba menggunakan generik untuk mencapai ini tetapi gagal kerana pelbagai sebab.

Dalam contoh di bawah, kekangan jenis terlalu kuat dan ia menghalang saya daripada memanggil kaedah validate()。我还尝试使用 validate() untuk memasukkan antara muka saya sendiri dan menggunakannya sebagai kekangan jenis, tetapi kemudiannya gagal pada bahagian penukaran jenis.

Bagaimana saya boleh mencapai ini tanpa mengubah suai enum?

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

Penyelesaian

Gunakan kekangan jenis yang menyatakan kaedah 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
}

Uji:

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

Ini akan menghasilkan (cuba di pergi taman permainan):

main.FooStatusEnum A

Atas ialah kandungan terperinci Bagaimana untuk menggunakan rentetan enum dengan kaedah sebagai parameter generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam