Golang中无需if/else处理nil指针的方法?
Go语言简化嵌套指针nil判断的写法
先贴出你的示例代码:
type MyStruct struct { ... MyField *MyOtherStruct ... } type MyOtherStruct struct { ... MyOtherField *string ... } // 接收MyOtherField作为参数的函数 func MyFunc(myOtherField *string) { ... } // 想要简化的if/else判断 if MyStruct.MyField != nil { MyFunc((*MyStruct.MyField).MyOtherField) } else { MyFunc(nil) }
你希望像JavaScript的三元表达式那样简化这段代码,Go本身没有三元运算符,但可以用以下几种方式实现更简洁的写法:
方式一:利用短变量声明简化if逻辑
把判断和变量声明合并成一行,减少代码冗余:
var target *string if mf := MyStruct.MyField; mf != nil { target = mf.MyOtherField } MyFunc(target)
这里mf的作用域仅限当前if块,既紧凑又不会污染外部作用域。
方式二:泛型辅助函数(Go 1.18+)
如果需要频繁处理这类嵌套指针的nil判断,可以写一个通用的泛型函数复用逻辑:
// GetOrNil 传入指针和取值函数,指针非nil时返回取值结果,否则返回nil func GetOrNil[T any](ptr *T, getter func(*T) *string) *string { if ptr != nil { return getter(ptr) } return nil }
调用时直接传入指针和字段的取值逻辑:
MyFunc(GetOrNil(MyStruct.MyField, func(m *MyOtherStruct) *string { return m.MyOtherField }))
这种方式适合多处需要类似判断的场景,复用性更高。
方式三:匿名函数立即执行
追求极致简洁的话,可以把判断逻辑封装到匿名函数里直接执行,作为参数传给MyFunc:
MyFunc(func() *string { if mf := MyStruct.MyField; mf != nil { return mf.MyOtherField } return nil }())
内容的提问来源于stack exchange,提问作者Hiếu Lê
相关产品推荐
相关产品推荐

