假设我写了两个这样的函数:
func ToInterfaceSlice[T any](s []T) []interface{} {
res := make([]interface{}, len(s))
for i, v := range s {
res[i] = v
}
return res
}
func FromInterfaceSlice[T any](s []interface{}) (res []T, err error) {
res = make([]T, len(s))
for i, v := range s {
vt, ok := v.(T)
if !ok {
return nil, fmt.Errorf("%v (type=%T) doesn't fit the target type %T", v, v, res)
}
res[i] = vt
}
return
}
当我从输入参数解析类型时,我可以简单地使用
var m = []int{1, 2, 3}
fmt.Println(ToInterfaceSlice(m))
编译器知道T是int.
但是,当我尝试从返回变量传递类型时
var m []int
m, _ = FromInterfaceSlice([]interface{}{1, 2, 3})
fmt.Println(m)
编译器报错:
.\scratch.go:29:27: 无法推断 T
我必须在函数调用中显式传递类型:
var m []int
m, _ = FromInterfaceSlice[int]([]interface{}{1, 2, 3})
fmt.Println(m)
当接收者变量不是接口时,从返回类型推断类型参数有什么困难吗?还是干脆不执行,甚至故意不执行?
评论后更新#1
我知道a, b := GenericFunc()不能引用返回值的类型。目前 Go 确实有“这取决于”情况是否需要来自用户输入的显式实例化。
type Set[T comparable] map[T]struct{}
func NewSet[T comparable](eles ...T) Set[T] {
s := make(Set[T])
for _, ele := range eles {
s[ele] = struct{}{}
}
return s
}
可以同时使用t := NewSet(1, 2, 3)and t := NewSet[string](),但var t NewSet[float64] = NewSet()现在不行,因为这个
猛跑小猪
相关分类