Go语言如何在编译期不依赖反射获取泛型类型参数名
Go泛型可变参数函数编译期获取类型参数T的实现
存在零运行时开销、不依赖反射、无需处理空参数边界的实现方式,核心是利用内置函数new构造类型参数的零值指针解引用,直接获取T的类型信息。
实现代码
import "fmt" func foo[T any](args ...T) string { return fmt.Sprintf("%+v are of type %T", args, *new(T)) }
方案特性
- 无额外开销:类型信息在编译期完成绑定,和固定参数泛型函数打印实参类型的效果完全一致,没有反射带来的性能损耗
- 无边界问题:即使可变参数
args为空切片(无任何实参传入),也能正确获取T的类型,不会出现索引越界问题 - 全类型兼容:无论T是基础类型、结构体、指针、接口,该写法都能正常输出正确的类型名
效果验证
func main() { // 传入int参数 fmt.Println(foo(1, 2, 3)) // 输出:[1 2 3] are of type int // 空参数显式指定int类型 fmt.Println(foo[int]()) // 输出:[] are of type int // 传入string参数 fmt.Println(foo("hello", "world")) // 输出:[hello world] are of type string }
实现原理
Go内置函数
new(T)会在编译期为T类型分配对应零值的内存空间,返回指向该零值的*T类型指针,对指针解引用即可得到T类型的值。整个过程不需要依赖任何传入的实参,所有类型判定在编译阶段就已完成。
内容的提问来源于stack exchange,提问作者Woody1193
相关产品推荐
相关产品推荐

