这个问题在这里已有答案:
我正在阅读github上用golang编写的一些代码,发现了非常有趣的一段代码 . 我把它简化为清楚 .
func Insert(docs ...interface{}) (err error) {
for i := 0; i < 3; i++ {
err = fmt.Errorf("")
if err.Error()!="EOF" {
return
}
}
return err
}
我对这里的空回归感到非常困惑......它是如何运作的?他返回nil为错误或中断循环?我明白这个问题看起来很虚伪,但我在go docs中找不到任何关于这个的信息......我也不明白我们如何能够返回错误,正如我所理解的那样,以某种方式宣布回报 . (错误错误)是否意味着我们的func中已经有一个错误变量,如果没有指定则用作默认返回值?为什么然后我们隐含地在func的末尾返回错误?
我非常感谢你的解释 .
3 回答
该函数使用“命名”返回值 .
来自the spec的返回声明:
使用命名返回允许您在手动分配局部变量时保存一些代码,并且有时可以清除凌乱的if / else语句或长的返回值列表 .
真的只是简写
它有点短,我同意它可能不那么明显 .
有时需要命名返回,因为它允许在延迟函数中访问它们之类的东西,但是就我所知,裸露的返回只是语法糖,并且从不严格要求 .
我看到的一个地方通常是在具有许多返回值的函数中的错误返回情况 .
比...更容易
当你必须写了很多次 . 如果您将签名更改为具有其他“实际”返回值,则无需修改这些返回 .
我在搜索的代码库中使用它们的大多数地方,它们似乎隐藏了其他气味,如过于复杂的多用途功能,如果/其他嵌套太深,那么类似的东西 .
如果您有一个命名的返回值(此处为
err
):这将通过该名称创建一个函数局部变量,如果只调用没有参数的
return
,它将返回局部变量 . 所以在这个功能中,是和,暗示,
这是详细的in the tour和in the spec .
可以命名Go的返回值 . 如果是这样,它们将被视为在函数顶部定义的变量 .
https://tour.golang.org/basics/7