Golang中如何减少nil检查的样板代码
Golang中如何减少nil检查的样板代码 大家好,
我有很多函数需要传入某个接口进行操作,并且必须先进行空值检查:
func F(foo MyInterface, …) (something, error) {
if foo == nil {
return ErrParamNil
}
…
}
有什么好方法可以减少这里的样板代码吗?
谢谢。
2 回复
以下是一个直接来自标准库文档(https://pkg.go.dev/html/template)的简单示例。
如果你想要在函数中局部定义一个错误处理器,这会很有用。
这是通过将一个匿名函数 func(err error) 赋值给 check 变量来实现的。(这得益于 Go 支持函数作为值。)
func funcWithLocallySpecificErrorHandlingButUsedMultipleTimes() {
check := func(err error) {
if err != nil {
log.Fatal(err)
}
}
_, err := errorReturningFunc()
check(err)
_, err := anotherErrorreturningFunc()
check(err)
}
更多关于Golang中如何减少nil检查的样板代码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
一种常见的方式是使用闭包来封装nil检查逻辑,减少重复代码。例如:
func withNilCheck(fn func() (something, error), foo MyInterface) (something, error) {
if foo == nil {
return nil, ErrParamNil
}
return fn()
}
func F(foo MyInterface, …) (something, error) {
return withNilCheck(func() (something, error) {
// 实际业务逻辑
…
}, foo)
}
另一种方式是使用反射来检查参数,但这会带来性能开销:
func checkNil(args ...interface{}) error {
for _, arg := range args {
if reflect.ValueOf(arg).IsNil() {
return ErrParamNil
}
}
return nil
}
func F(foo MyInterface, …) (something, error) {
if err := checkNil(foo); err != nil {
return nil, err
}
…
}
也可以考虑使用代码生成工具来自动生成nil检查代码,例如通过go generate配合模板来生成。

