golang中如何声明泛型指针接口或者切片指针接口参数的方法?

问题描述 投票:0回答:1

例如:

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 generics
1个回答
0
投票

类型推断不适用于约束没有核心类型的情况。这可能需要一个多项式时间求解器,这对于 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)
}
© www.soinside.com 2019 - 2024. All rights reserved.