2016-07-29 8 views
4

Warum ist das ein gültiges Programm?Mehrfacher Rückgabewert und: = in go

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

} 

Und das ist nicht?

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

} 

bemängelt, dass ./main.go:18: no new variables on left side of :=

Ich dachte := nicht Wert zu vorhandenen Variablen verwendet werden können, ändern?

Antwort

6

Die documentation ist an dieser Stelle klar:

In: = Deklaration eine Variable v selbst erscheinen kann, wenn es bereits erklärt worden ist, zur Verfügung gestellt:

diese Erklärung im gleichen Umfang ist wie die vorhandene Deklaration von v (wenn v bereits in einem äußeren Bereich deklariert ist, wird die Deklaration eine neue Variable erstellen §), der entsprechende Wert in der Initialisierung kann v zugewiesen werden, und gibt es mindestens eine andere Variable in der Deklaration, die erneut deklariert wird.

1

Die Regel ist, dass mindestens eine der Variablen auf der linken Seite neu sein muss. Häufig wird Code angezeigt, der die error-Variable wiederverwendet, wenn ein Funktionsaufruf nach dem anderen ausgeführt wird.

In Ihrem zweiten Beispiel ordnen Sie beide Werte neu zu, so dass Sie in einem solchen Fall = bei der nachfolgenden Zuweisung verwenden müssen. Dieses besondere Detail muss man sehr oft in Go begründen. Sie gewöhnen sich aber schnell daran, es ist ziemlich geradlinig.

1

klashxx schon die Frage beantworten.

Hier kann etwas verwirrend sein.

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