首頁 > 後端開發 > Golang > 主體

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

WBOY
發布: 2024-02-10 14:21:17
轉載
989 人瀏覽過

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

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!