在Go中返回错误时对结果值的最佳做法

时间:2019-02-07 16:24:56

标签: go

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

示例:

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

如果[]string不是nilerror的返回值应该是nil吗?

1 个答案:

答案 0 :(得分:1)

通常来说,如果函数未能完成任务,则应将其返回值视为不可靠。由于go中的错误是值,因此调用方可能会忽略返回的错误。例如:

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

b, _ := json.Marshal(foo)

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

slice, _ := mayError()

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

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

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