![](/img/trans.png)
[英]How to write a generic function that takes a string or an error as a parameter?
[英]How to use a string enum with a method as a generic parameter?
我有多个字符串派生的枚举,它们共享一个通用的Validate()
方法(都在我的控制范围之外)。 我想要一个将字符串转换为这些枚举并在生成的枚举上调用Validate()
的通用方法。 我试图用 generics 实现这一点,但由于各种原因失败了。
在下面的示例中,类型约束太强,无法调用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)
这将是 output(在Go 游乐场上试试):
main.FooStatusEnum A
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.