Go反射中如何通过reflect.Type获取指针类型及反向获取基础类型
Go reflect 基础类型与对应指针类型互转实现
场景说明
现有一个reflect.Type类型变量t:
fmt.Println(t) // 输出 lib.Counter
需要获取该类型对应的指针类型ptrT,满足:
fmt.Println(ptrT) // 输出 *lib.Counter
方案需要适配任意类型,不局限于lib.Counter;同时需要实现反向操作:从代表*lib.Counter的reflect.Type实例,获取其对应的基础类型lib.Counter。
具体实现
1. 从基础类型获取对应指针类型
直接调用reflect标准库内置的PtrTo方法即可,传入原基础类型的reflect.Type实例,就能返回对应指针类型的实例:
// t 为任意非指针类型的reflect.Type实例 ptrT := reflect.PtrTo(t) fmt.Println(ptrT) // 输出 *lib.Counter
这个方法对所有Go合法类型都生效,不需要额外做类型判断。
2. 从指针类型获取对应基础类型
针对指针类型的reflect.Type实例,直接调用其Elem()方法,就能返回指针指向的基础类型实例:
// ptrT 为指针类型的reflect.Type实例 baseT := ptrT.Elem() fmt.Println(baseT) // 输出 lib.Counter
注意:
Elem()方法并非仅对指针类型生效,切片、数组、Map、Channel类型调用Elem()会返回其元素类型。如果你的输入类型不确定,建议先做类型判断再调用:if ptrT.Kind() == reflect.Ptr { baseT := ptrT.Elem() // 处理基础类型逻辑 }
内容的提问来源于stack exchange,提问作者johnydoey
相关产品推荐
相关产品推荐

