Go语言如何安全获取指针类型底层值 空指针返回基础类型默认值
问题描述
我找到了相关问题《如何获取Go中Interface{}底层值的指针》,但其中提供的方案安全性不足。
常规写法中可以使用*操作符对指针解引用获取底层值,但这种方式要求每次在调用侧手动补充nil判空逻辑,否则遇到nil指针会直接触发panic,示例代码如下:
x := &some_type fmt.Println(*x)
我希望实现一个通用解包函数:当传入的指针为nil时,自动返回对应基础类型的默认值,函数调用形式如下:
x := Unpacker(some_type)
实现方案
Go 1.18 及以上版本可通过泛型实现类型安全的通用解包函数,无反射开销,编译期即可完成类型校验,实现代码如下:
func Unpacker[T any](ptr *T) T { if ptr == nil { var zeroVal T return zeroVal } return *ptr }
使用示例
type Demo struct { ID int Name string } func main() { // 非nil指针场景 d1 := &Demo{ID: 1, Name: "test"} v1 := Unpacker(d1) fmt.Printf("%+v\n", v1) // 输出:{ID:1 Name:test} // nil指针场景 var d2 *Demo v2 := Unpacker(d2) fmt.Printf("%+v\n", v2) // 输出:{ID:0 Name:},无panic // 支持任意基础类型指针 var num *int v3 := Unpacker(num) fmt.Println(v3) // 输出:0 }
特性说明
- 完全类型安全,编译期校验入参和返回值类型,不会出现运行时类型错误
- 自动处理nil指针场景,返回对应类型的零值,无需调用方重复编写判空逻辑
- 无反射调用,性能和原生解引用几乎一致
- 兼容所有指针类型,包括结构体指针、基础类型指针等
内容的提问来源于stack exchange,提问作者YOU
相关产品推荐
相关产品推荐

