我有一个接收反射值的 Go 代码,需要将其作为泛型使用。为了转换参数,我已经完成了以下工作。有没有更简单的方法来实现目标?
func toValue[T any](v reflect.Value) T {
v = v.Convert(reflect.TypeFor[T]())
var src any
reflect.ValueOf(&src).Elem().Set(v)
var dest T
reflect.ValueOf(&dest).Elem().Set(reflect.ValueOf(src))
return dest
}
我在通用解析器中使用它,让客户端使用泛型来生成类型化输出。
通过对转换结果使用类型断言来简化函数:
func toValue[T any](v reflect.Value) T {
return v.Convert(reflect.TypeFor[T]()).Interface().(T)
}
(与问题中的代码一样,当 v 无法转换为 T 时,此函数会出现恐慌)。