我有多个字符串派生的枚举,它们共享一个通用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()
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
测试它:
result := stringToValidatedEnum[FooStatusEnum]("A")
fmt.Printf("%T %v", result, result)
Run Code Online (Sandbox Code Playgroud)
这将输出(在Go Playground上尝试):
main.FooStatusEnum A
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
423 次 |
| 最近记录: |