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
Lepaskan: 2024-02-10 14:21:17
ke hadapan
1022 orang telah melayarinya

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()
}
Salin selepas log masuk

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
}
Salin selepas log masuk

Uji:

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

Ini akan menghasilkan (cuba di pergi taman permainan):

main.FooStatusEnum A
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan