go - func中的空返回与golang中的返回值

标签 go

我在 Github 上阅读了一些用 Golang 编写的代码,发现了一段非常有趣的代码。我把它简化了。

func  Insert(docs ...interface{}) (err error) {
    for i := 0; i < 3; i++ {
        err = fmt.Errorf("")
        if err.Error()!="EOF" {
            return
        }
    }
    return 
}

我对这里的空返回很困惑......它是如何工作的?他是否返回 nil 作为错误或中断循环?我知道这个问题看起来很愚蠢,但是我在 go docs 中找不到任何关于此的信息......另外,我不明白我们如何返回错误,据我所知,这是以某种方式声明的作为返回。 (err error) 是否意味着我们的 func 中已经有一个可用的错误变量,如果没有指定,它用作默认返回值?那么为什么我们在 func 的末尾隐式地返回错误?

非常感谢您的解释。

最佳答案

该函数使用“命名”返回值。

来自 the spec关于返回声明:

The expression list may be empty if the function's result type specifies names for its result parameters. The result parameters act as ordinary local variables and the function may assign values to them as necessary. The "return" statement returns the values of these variables.

Regardless of how they are declared, all the result values are initialized to the zero values for their type upon entry to the function. A "return" statement that specifies results sets the result parameters before any deferred functions are executed.

使用命名返回可以节省一些手动分配局部变量的代码,并且有时可以清理凌乱的 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 嵌套等等。

关于go - func中的空返回与golang中的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45239409/

相关文章:

Golang (Go) AES CBC 密文由于某种原因被填充了 16 个 0x00 字节

json - 如何根据 swagger 架构验证 JSON 架构实例?

session - session 的最佳实践( gorilla / session )

random - 在最小值、最大值之间生成加密随机整数

Go goroutine 加锁和解锁

Golang API - MySQL 连接但查询为空

postgresql - 如何将元素添加到 Postgres 中的 json 字段数组

go - 如何在 google cloud run for firebase 中创建上下文对象

javascript - 接收二维数组 args 作为 js.Value 并想要一个数组 ([]js.Value)

golang追加语法错误: missing statement after label