2016-07-29 7 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つの他の 新しく宣言される宣言内の変数

1

左辺の変数の少なくとも1つが新しいものでなければならないという規則があります。ある関数呼び出しを続けて実行するときには、変数errorを再利用するコードが一般的に表示されます。そのような場合には、あなたが、その後の割り当てに=を使用する必要がありますので、あなたは両方の値を再割り当てしている2番目の例では

。その具体的な詳細は、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) 
} 
関連する問題