例如:
type AnyPtr[T any] interface {
*T
}
type AnyPtrSlice[T any] interface {
[]*T
}
func FuncName[T AnyPtr[E] | AnyPtrSlice[E], E any](data T) (err error) {
}
type ModelAA struct {
A int
B int
}
func TestAddV2(t *testing.T) {
var a = ModelAA{
A: 1, B: 2,
}
_ = FuncName(&a)
}
这种方式会被编译器报无法推断E,还有其他写法吗?
希望有办法解决。我希望它不会被分成多种方法。
类型推断不适用于约束没有核心类型的情况。这可能需要一个多项式时间求解器,这对于 Go 快速编译时间的承诺来说并不好。
联合约束,例如
*T | []*T
,本质上与T AnyPtr[E] | AnyPtrSlice[E]
相同,没有核心类型。
当类型推断不起作用时,您必须显式实例化类型参数。如果将类型参数
E
移动到列表的开头,这将是唯一显式必需的类型参数,然后可以从中推断出 T
。
// move E at the beginning of the type param list
func FuncName[E any, T AnyPtr[E] | AnyPtrSlice[E]](data T) error {
return nil
}
func TestAddV2(t *testing.T) {
a := ModelAA{}
// supply a type argument for E
_ = FuncName[ModelAA](&a)
}