该函数使用“命名”返回值。
From the spec https://golang.org/ref/spec#Return_statements关于返回语句:
如果函数的结果类型,则表达式列表可能为空
指定其结果参数的名称。结果参数作用
作为普通的局部变量,函数可以给它们赋值
有必要的。 “return”语句返回这些值
变量。
无论如何声明,所有结果值都是
在进入时初始化为其类型的零值
功能。指定结果集的“return”语句
执行任何延迟函数之前的参数。
使用命名返回可以让您节省一些手动分配局部变量的代码,并且有时可以清理混乱的 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
当你必须写很多次的时候。如果您更改签名以获得额外的“真实”返回值,则不必修改这些返回值。
我在刚刚搜索的代码库中使用它们的大多数地方,它们似乎确实隐藏了其他气味,比如过于复杂的多用途函数、太深的 if/else 嵌套等等。