Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go中返回错误时结果值的最佳实践_Go - Fatal编程技术网

Go中返回错误时结果值的最佳实践

Go中返回错误时结果值的最佳实践,go,Go,如果您的函数同时返回值类型和错误类型,那么当错误类型为非nil时,确保值类型为niled/zero value是否是“好办法” 例如: func mayError() ([]string, error) { ... } 如果error不是nil,则[]字符串的返回值是否应为nil?一般来说,如果函数未能完成任务,其返回值应视为不可靠。因为go中的错误是值,所以调用方可能会忽略它返回的错误。对于exmaple: foo := myType{ Bar: 123, Foo: "s

如果您的函数同时返回值类型和错误类型,那么当错误类型为非nil时,确保值类型为niled/zero value是否是“好办法”

例如:

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

如果
error
不是
nil
,则
[]字符串的返回值是否应为
nil

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

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
返回的任何错误都被忽略。这使代码更易于调试/维护/修复。

取决于您的用例。如果您阅读任何go代码,通常会看到
返回nil,err
,但非nil的情况也确实存在。例如,io.Readers通常返回一个非零的数字和io.EOF。@georgearity一些API记录错误时的非零返回值。io.Reader和io.Writer是两个常见的例子。@georgearity只要函数的第一个返回参数是不可为零的类型,该函数在出现错误时就不能返回nil。@georgearity:http.Client
CheckRedirect
失败时返回非nil响应正文。关键是,如果你选择不遵守规范,请确保它是文档化的。这是基于观点的,但对我来说,在完全愚蠢的消费者面前为你的API辩护没有什么意义。“如果你做了一些傻瓜证明,有人会做一个更好的傻瓜。”如果有人不检查错误,那就在他们身上;函数签名清楚地表明他们应该检查错误。@Adrian:鉴于问题的模糊性,我无法对OP的具体情况给出明确的答案。我现在正在开发一个代码库,它包含一个返回value+error的函数。基于调用链上的参数,以及返回的特定错误,我可能仍然使用这些值。这类东西可能有一个有效的用例,但我发现自己可能做过一次/year@EliasVanOotegem我选择你的答案;然而,它只是提出了更多的问题,与阿德里安的想法差不多。