首页 文章

在golang中以flang返回值的空返回[重复]

提问于
浏览
6

这个问题在这里已有答案:

我正在阅读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 回答

  • 11

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

    来自the spec的返回声明:

    如果函数的结果类型指定其结果参数的名称,则表达式列表可以为空 . 结果参数充当普通局部变量,并且函数可以根据需要为它们分配值 . “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
    

    当你必须写了很多次 . 如果您将签名更改为具有其他“实际”返回值,则无需修改这些返回 .

    我在搜索的代码库中使用它们的大多数地方,它们似乎隐藏了其他气味,如过于复杂的多用途功能,如果/其他嵌套太深,那么类似的东西 .

  • 2

    如果您有一个命名的返回值(此处为 err ):

    func  Insert(docs ...interface{}) (err error) {
    

    这将通过该名称创建一个函数局部变量,如果只调用没有参数的 return ,它将返回局部变量 . 所以在这个功能中,

    return
    

    是和,暗示,

    return err
    

    这是详细的in the tourin the spec .

  • 3

    可以命名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))
    }
    

    https://tour.golang.org/basics/7

相关问题