Übergeben von Parametern zum Schließen der Funktion

8

Ich versuche, den Unterschied in Go zwischen dem Erstellen einer anonymen Funktion, die einen Parameter akzeptiert, und der Funktion, die als eine Funktion fungiert, zu verstehen. Hier ist ein Beispiel für den Unterschied.

Mit Parameter:

%Vor%

Als Schließung:

%Vor%

Meine Frage ist, wann ist die erste Form besser als die zweite? Würden Sie jemals einen Parameter für diese Art von Ding verwenden? Das einzige Mal, wenn ich das erste Formular sehen kann, das nützlich ist, ist, wenn ich func(x, y) von einer anderen Funktion zurückgebe.

    
Dave 12.05.2015, 06:46
quelle

2 Antworten

9

Der Unterschied zwischen der Verwendung eines Closures und der Verwendung eines Funktionsparameters liegt darin, die gleiche Variable zu verwenden, anstatt eine Kopie des Werts zu erhalten. Betrachten Sie diese zwei Beispiele unten.

In der Closure verwenden alle Funktionsaufrufe den in i gespeicherten Wert. Dieser Wert wird höchstwahrscheinlich bereits 3 erreichen, bevor eine der Goroutinen Zeit hatte, ihren Wert zu drucken.

Im Beispiel Parameter wird jedem Funktionsaufruf eine Kopie des Wertes von i übergeben, wenn der Aufruf ausgeführt wurde. Dies gibt uns das Ergebnis, das wir wahrscheinlicher wollten:

Schließung:

%Vor%

Ergebnis:

  

3
  3
  3

Parameter:

%Vor%

Ergebnis:

  

0
  1
  2

Spielplatz: Ссылка

    
ANisus 12.05.2015, 06:59
quelle
4

Wann Parameter zu verwenden sind

Definitiv wird die erste Form bevorzugt, wenn Sie den Wert der Variablen ändern wollen, die Sie nicht in der Funktion beobachten möchten.

Dies ist der typische Fall, wenn sich die anonyme Funktion in einer for -Schleife befindet und Sie beabsichtigen, die Variablen der Schleife zu verwenden, zum Beispiel:

%Vor%

Ohne die Variable i zu übergeben, können Sie 10 zehn Mal drucken. Wenn Sie i übergeben, werden Sie Zahlen beobachten, die von 0 bis 9 gedruckt wurden.

Wenn keine Parameter verwendet werden sollen

Wenn Sie den Wert der Variablen nicht ändern möchten, ist es günstiger, sie nicht zu übergeben und somit keine weitere Kopie davon zu erstellen. Dies gilt insbesondere für große Strukturen. Wenn Sie später den Code ändern und die Variable ändern, können Sie leicht vergessen, die Auswirkung auf den Abschluss zu überprüfen und unerwartete Ergebnisse zu erhalten.

Es kann auch Fälle geben, in denen Sie Änderungen an "äußeren" Variablen beobachten möchten, beispielsweise:

%Vor%

In diesem Fall soll GetRes() eine Ressource öffnen. Aber bevor es zurückkommt, müssen andere Dinge getan werden, die auch scheitern könnten. Wenn diese fehlschlagen, muss res geschlossen und nicht zurückgegeben werden. Wenn alles gut geht, darf res nicht geschlossen und zurückgegeben werden.

    
icza 12.05.2015 06:59
quelle

Tags und Links