Wie funktioniert aufschieben und named return value arbeiten in golang?
Ich gerade angefangen zu lernen, golang und ich war verwirrt mit einem Beispiel über die Verwendung aufzuschieben, zu ändern named return value in der golang blog-post hier.
Beispiel sagt:
- Latente Funktionen Lesen und zuordnen, um die Rückkehr-Funktion benannt, die Werte zurückgeben.
In diesem Beispiel, eine latente Funktion erhöht den return-Wert, den ich nach dem umliegenden Funktion gibt. So, diese Funktion gibt 2:
func c() (i int) {
defer func() { i++ }()
return 1
}
Aber als das, was ich gelernt habe, aus Eine Tour von Go - Namens return-Werte
Eine return-Anweisung ohne Argumente gibt den Namen, die Werte zurückgeben. Dies ist bekannt als "nackt" zurück.
Getestet habe ich in folgenden code und in Funktion b es gibt 1 zurück, denn es war nicht das Eine return-Anweisung ohne Argumente oben genannten Fall.
func a() (i int) { //return 2
i = 2
return
}
func b() (i int) { //return 1
i = 2
return 1
}
Also meine Frage ist in dem ersten Beispiel, die umliegenden Funktion c hat eine named return value ich, aber die Funktion c verwendet return 1, die im zweiten Beispiel können wir sehen, es sollte wieder 1, egal welchen Wert ich ist. Aber warum, nachdem ich änderungen in der latenten Funktion der c-Funktion gibt den Wert von i, statt den Wert 1?
Als ich getippt meine Frage, die ich vielleicht erraten haben, die Antwort. Ist es, weil
return 1
ist gleich
i = 1
return
in eine Funktion mit einem named return value variable i ?
Helfen Sie mir bitte bestätigen, danke!
InformationsquelleAutor Lution | 2016-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anderen Weg zum Verständnis der obigen Aussage:
Nach, wird 1 zurückgegeben, aufschieben
func() { i++ }()
ausgeführt. Daher, um von Hinrichtungen:Für das Verständnis Willen:
Reihenfolge der Hinrichtungen:
"executer, nachdem die Funktion" ist falsch. Die specs ganz klar sagen, "latente Funktionen aufgerufen werden, die unmittelbar vor der umgebenden Funktion", nicht nach. Wenn verzögert, waren aufgerufen, nach der Rückkehr, Sie wäre nicht in der Lage, ändern Sie den Rückgabewert im Fall von
func c
. Die Reihenfolge der Ausführung sollte dann sein:i = 1
(assign)i++
(aufschieben Inkrement)return
Gegenzug 2Behoben! 🙂
InformationsquelleAutor Roy Lee
Ich denke, die Verwirrung ist über die Funktion in der Funktion, wie wärs, wenn du eingestuft wie diese:
aber wenn der return-Wert ist nicht mit Namen wie:
Ich hoffe, das wird klar, die Verwirrung und das ist, wie ich gerne Gehen Kodierung
InformationsquelleAutor Ahmed Ozmaan
Entsprechend Gehen die Spezifikation:
Return-Anweisungen
Ein "return" - Anweisung, der angibt, die Ergebnisse stellt die Ergebnis-Parameter vor jeder latenten Funktionen ausgeführt werden.
Aufschieben Aussagen
"...latente Funktionen aufgerufen werden, die unmittelbar vor der umgebenden Funktion gibt..."
Also ja, Sie haben angenommen, die named return-variable zugewiesen wird, dann wird die latente Aussage Schritten.
Ich würde hinzufügen, dass benannte Parameter zurückgeben kann führen zu subtilen bugs, und in der Regel sollte vermieden werden, es sei denn, es keine alternative.
InformationsquelleAutor Mark