我正在阅读github上用golang编写的一些代码,发现了非常有趣的一段代码.我把它简化为清楚.
func Insert(docs ...interface{}) (err error) {
for i := 0; i < 3; i++ {
err = fmt.Errorf("")
if err.Error()!="EOF" {
return
}
}
return
}
Run Code Online (Sandbox Code Playgroud)
我对这里的空回归感到非常困惑......它是如何运作的?他返回nil为错误或中断循环?我明白这个问题看起来很虚伪,但我在go docs中找不到任何关于这个的信息......我也不明白我们如何能够返回错误,正如我所理解的那样,以某种方式宣布回报.(错误错误)是否意味着我们的func中已经有一个错误变量,如果没有指定则用作默认返回值?为什么然后我们隐含地在func的末尾返回错误?
我非常感谢你的解释.
cap*_*aig 16
该函数使用"命名"返回值.
从返回声明的规范:
如果函数的结果类型指定其结果参数的名称,则表达式列表可以为空.结果参数充当普通局部变量,并且函数可以根据需要为它们分配值."return"语句返回这些变量的值.
无论如何声明它们,所有结果值在进入函数时都会初始化为其类型的零值.指定结果的"return"语句在执行任何延迟函数之前设置结果参数.
使用命名返回允许您在手动分配局部变量时保存一些代码,并且有时可以清除凌乱的if/else语句或长的返回值列表.
func a()(x []string, err error){
return
}
Run Code Online (Sandbox Code Playgroud)
真的只是简写
func a() ([]string,error){
var x []string
var err error
return x,err
}
Run Code Online (Sandbox Code Playgroud)
它有点短,我同意它可能不那么明显.
命名的回报,所以有时需要,因为它允许之类的东西访问它们递延函数内部,而是赤裸裸的回报只是语法糖,据我所知道的,并且永远不会严格要求.
我看到的一个地方通常是在具有许多返回值的函数中的错误返回情况.
if(err != nil){
return
}
return a,b,c,nil
Run Code Online (Sandbox Code Playgroud)
比...更容易
if(err != nil){
return nil,nil,nil,err
}
return a,b,c,nil
Run Code Online (Sandbox Code Playgroud)
当你必须写了很多次.如果您将签名更改为具有其他"实际"返回值,则无需修改这些返回.
我在搜索的代码库中使用它们的大多数地方,它们似乎隐藏了其他气味,如过于复杂的多用途功能,如果/其他嵌套太深,那么类似的东西.
小智 8
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))
}
Run Code Online (Sandbox Code Playgroud)
https://tour.golang.org/basics/7
当你有一个命名的返回值时(err这里):
func Insert(docs ...interface{}) (err error) {
Run Code Online (Sandbox Code Playgroud)
这将通过该名称创建一个函数局部变量,如果您只是return不带参数调用,它将返回局部变量。所以在这个函数中,
return
Run Code Online (Sandbox Code Playgroud)
与并暗示,
return err
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13016 次 |
| 最近记录: |