简化从反射值创建通用类型值

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

我有一个接收反射值的 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
}

我在通用解析器中使用它,让客户端使用泛型来生成类型化输出。

go reflection
1个回答
0
投票

通过对转换结果使用类型断言来简化函数:

func toValue[T any](v reflect.Value) T {
    return v.Convert(reflect.TypeFor[T]()).Interface().(T)
}

(与问题中的代码一样,当 v 无法转换为 T 时,此函数会出现恐慌)。

https://go.dev/play/p/mg5NjuUh_Tu

© www.soinside.com 2019 - 2024. All rights reserved.