首页 > 解决方案 > 在 Go 中返回错误时结果值的最佳实践

问题描述

如果您的函数既返回值类型又返回错误类型,当错误类型为非 nil 时,确保值类型为 niled/零值是“可行的方法”吗?

例子:

func mayError() ([]string, error) {
  ...
}

如果不是,返回[]string值应该nil是?errornil

标签: go

解决方案


一般来说,如果一个函数未能完成任务,它的返回值应该被视为不可靠。因为 go 中的错误是值,所以调用者可能会忽略它返回的错误。例如:

foo := myType{
    Bar: 123,
    Foo: "some string",
}

b, _ := json.Marshal(foo)

我忽略了这个错误,因为它是我创建的一种类型,而且我知道它可以被编组。但是,无论哪种方式,它都被认为是不好的做法。同样,现在想象有人调用你的函数:

slice, _ := mayError()

在向切片添加 2 个元素后,您的函数会出错。返回部分切片可能并且可能会导致进一步的错误行为。这使得代码难以调试。总的来说,我会说在这种情况下最好返回一个 nil 切片和一个错误。如果代码如下所示:

slice, _ := mayError() // returns nil, someErr
// panic
if slice[0] != "" {
}

至少错误会立即显示出来,您会看到任何返回的错误mayError都被忽略了。这使得代码更容易调试/维护/修复。


推荐阅读