1 回答
TA贡献1858条经验 获得超8个赞
当前的类型推断规则是明确的。不考虑如何使用返回值:
类型推断是基于
类型参数列表
用已知类型参数初始化的替换映射 M,如果有的话
普通函数参数的(可能为空)列表(仅在函数调用的情况下)
从 Go 1.18 开始,可能会简单地重写您的函数以接受所需类型的参数;这也有不隐藏函数体内分配的好处:
func FromInterfaceSlice[T any](s []interface{}, dst []T) error {
if len(s) != len(dst) {
return errors.New("lengths don't match")
}
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)
}
dst[i] = vt
}
return nil
}
并传入具有所需长度的目标切片:
func main() {
src := []interface{}{1, 2, 3}
m := make([]int, len(src))
_ = FromInterfaceSlice(src, m)
fmt.Println(m)
}
如果您不能或不想事先确定切片的长度,则只能进行显式实例化:
var m []int
m, _ = FromInterfaceSlice[int]([]interface{}{1, 2, 3})
// ^^^ explicit type argument
此外,类型参数仍然无法通过:=简写声明推断出来:
// what is m???
m, err := FromInterfaceSlice([]interface{}{1, 2, 3})
- 1 回答
- 0 关注
- 96 浏览
添加回答
举报