我正在阅读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的末尾返回错误?
我将非常感谢您的解释。
答案 0 :(得分:12)
该函数使用&#34;命名&#34;返回值。
来自the spec的退货声明:
如果函数的结果类型,表达式列表可能为空 指定其结果参数的名称。结果参数起作用 作为普通局部变量,函数可以为它们赋值 有必要的。 &#34;返回&#34;语句返回这些值 变量
无论如何声明它们,所有结果值都是 在进入时,它们的类型初始化为零值 功能。 A&#34;返回&#34;指定结果的语句设置结果 执行任何延迟函数之前的参数。
使用命名返回允许您在手动分配局部变量时保存一些代码,并且有时可以清除凌乱的if / else语句或长的返回值列表。
func a()(x []string, err error){
return
}
实际上只是
的简写func a() ([]string,error){
var x []string
var err error
return x,err
}
它有点短,我同意它可能不太明显。
有时需要命名返回,因为它允许在延迟函数中访问它们之类的东西,但是就我所知,裸露的返回只是语法糖,并且绝不是严格要求的。
我看到的一个地方通常是在具有许多返回值的函数中的错误返回情况。
if(err != nil){
return
}
return a,b,c,nil
比
更容易if(err != nil){
return nil,nil,nil,err
}
return a,b,c,nil
当你必须写了很多次。如果您更改签名以获得额外的&#34;真实&#34;并且您不必修改这些退货。返回值。
我在搜索的代码库中使用它们的大多数地方,它们似乎隐藏了其他气味,如过于复杂的多用途功能,如果/其他嵌套太深,那么就是这样。
答案 1 :(得分:4)
当你有一个命名的返回值(err
)时:
func Insert(docs ...interface{}) (err error) {
这将通过该名称创建一个函数局部变量,如果只调用没有参数的return
,它将返回局部变量。所以在这个函数中,
return
与
相同,暗示着return err
答案 2 :(得分:2)
Go的返回值可能会被命名。如果是这样,它们将被视为函数顶部定义的变量。
package main
import "fmt"
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
func main() {
fmt.Println(split(17))
}