2016-07-29 46 views
4

为什么这是一个有效的程序?多次返回值和:=进去

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 :=

我想:=不能用来改变方面对现有的变量?

回答

6

documentation在这一点清楚:

在:=声明它是否已经 被宣布为变量v甚至可能出现,提供:

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

1

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

在第二个示例中,您将重新分配两个值,因此在后续分配时必须使用=。这个特别的细节是你在Go中经常需要推理的一个细节。尽管你已经习惯了,但它非常简单。

1

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) 
}