在for循环

时间:2017-11-05 14:57:34

标签: function variables go scope

我有一个GoLang函数,它试图在 FOR 循环中设置一些命名的返回变量。它看起来像这样:

func (dbs *myClient) DoStuff() (response []byte, e error) {
    for i:=0;i<5;i+=1 {
        response, e = dbs.doNetworkThing()
        if e == nil {
            break;
        }
    }
    return response, e
}

基本上我要做的是将返回变量responsee设置为doNetworkThing()的第一个结果,该结果不会失败。

问题是,一旦我退出for循环,responsee就会重置。在GoLang中做这样的事情的正确方法是什么?

我真的想使用命名的返回变量,因为它们使事情更容易阅读(我会认为这样的事情是一个丑陋的解决方案)。

// Seems to be an ugly solution - would prefer using named return vars
func (dbs *myClient) DoStuff() ([]byte, error) {
    var response []byte
    var e error
    for i:=0;i<5;i+=1 {
        response, e := dbs.doNetworkThing()
        if e == nil {
            break;
        }
    }
    return response, e
}

2 个答案:

答案 0 :(得分:5)

下面的代码似乎有效(编译)。经过测试here

func (dbs *myClient) DoStuff() (response []byte, e error) {
    for i:=0;i<5;i+=1 {
        response, e = dbs.doNetworkThing()
        if e == nil {
            break;
        }
    }
    return
}

我做了什么:

  1. 我删除了responsee声明,因为它已经在您命名返回值时已经声明。
  2. :=更改为=因为(再次)变量已经声明
  3. return response, e更改为return,因为返回值已命名为
  4. 希望它有所帮助! :)

答案 1 :(得分:1)

在这个特定的例子中,你可以退出循环:从而解决2个方法来打破循环并返回值。

func (dbs *myClient) DoStuff() (response []byte, e error) {
    for i:=0;i<5;i+=1 {
        response, e = dbs.doNetworkThing()
        if e == nil {
            return response, e
        }
    }

}