多个返回值和:= in go

时间:2016-07-29 17:57:12

标签: go multiple-return-values

为什么这是一个有效的程序?

package main

import "fmt"

func giveMeError(limit int) ([]string, error) {
    return nil, fmt.Errorf("MY ERROR %d", limit)
}

func main() {

    res1, err := giveMeError(1)
    if err == nil {
        fmt.Println("res", res1)
    } else {
        fmt.Println("err", err)
    }

    res2, err := giveMeError(5)
    if err == nil {
        fmt.Println("res", res2)
    } else {
        fmt.Println("err", err)
    }

}

这不是吗?

package main

import "fmt"

func giveMeError(limit int) ([]string, error) {
    return nil, fmt.Errorf("MY ERROR %d", limit)
}

func main() {

    res, err := giveMeError(1)
    if err == nil {
        fmt.Println("res", res)
    } else {
        fmt.Println("err", err)
    }

    res, err := giveMeError(5)
    if err == nil {
        fmt.Println("res", res)
    } else {
        fmt.Println("err", err)
    }

}

抱怨./main.go:18: no new variables on left side of :=

我认为:=不能用于将值更改为现有变量?

3 个答案:

答案 0 :(得分:8)

此时documentation很明确:

  

在:=声明中,即使已经存在,也可能出现变量v   已经宣布,提供:

     

此声明与v的现有声明属于同一范围   (如果v已在外部范围内声明,则声明将   创建一个新的变量§),相应的值   初始化可分配给v,至少有一个其他   在声明中重新声明的变量

答案 1 :(得分:2)

规则是左侧的至少一个变量必须是新的。您通常会看到在执行一个又一个函数调用时重用error变量的代码。

在您的第二个示例中,您将重新分配这两个值,以便在后续分配时必须使用=。这个特别的细节是你必须经常在Go中推论的。你很快就会习惯它,它非常直接。

答案 2 :(得分:2)

klashxx已经回答了这个问题。

这里可能有些混乱。

package main

import "fmt"

func main(){
     a, b := 1, 2            
     fmt.Println(a, b)
     {
         b, c := 100, 200       //NOTE: b here is a new variable
         fmt.Println(a, b, c)
     }

     fmt.Println(a, b)

     b, c := 1000, 2000
     fmt.Println(a, b, c)
}