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配合模板来生成。

回到顶部