首頁 >後端開發 >Golang >如何使用帶有方法的字串枚舉作為泛型參數?

如何使用帶有方法的字串枚舉作為泛型參數?

WBOY
WBOY轉載
2024-02-10 14:21:171030瀏覽

如何使用帶有方法的字串枚舉作為泛型參數?

php小編柚子在這裡為大家介紹如何使用帶有方法的字串枚舉作為泛型參數。在程式設計中,我們經常需要使用泛型來增加程式碼的靈活性和可重複使用性。而使用帶有方法的字串枚舉作為泛型參數,可以使我們的程式碼更加簡潔和有效率。接下來,我們將詳細闡述如何實現這項功能,並給出具體的範例程式碼。讓我們一起來探索這個有趣的程式技巧吧!

問題內容

我有多個字串派生的枚舉,它們共享一個通用的 validate() 方法(全部超出我的控制範圍)。我想要一個通用方法,將字串轉換為這些枚舉,並在生成的枚舉上呼叫 validate() 。我嘗試使用泛型來實現這一目標,但由於各種原因失敗了。

在下面的範例中,型別約束太強,導致無法呼叫 validate()。我還嘗試使用 validate() 方法插入我自己的介面並將其用作類型約束,但隨後在類型轉換部分失敗。

如何在不修改枚舉的情況下實現此目的?

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

解決方法

使用指定 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
}

測試它:

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

這將輸出(在 go playground 上嘗試):

main.FooStatusEnum A

以上是如何使用帶有方法的字串枚舉作為泛型參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除