Go-Schlüsselwörter wie go und defer Expect-Funktionsaufrufe als Parameter. Gibt es einen dedizierten Typ, der denselben Zweck erfüllen kann und es Funktionen ermöglicht, Funktionsaufrufe als Argumente anstelle von Funktionen zu empfangen?
Leider gibt es keinen solchen Typ Gehen. Das Verhalten von go und defer ist in die Sprachspezifikation integriert und wird vom Compiler erzwungen.
Stattdessen ist es möglich, Funktionswerte als Variablen oder Werte zu verwenden. Diese können später aufgerufen werden, als wären sie reguläre Funktionen.
<code class="go">func myFunc() { fmt.Println("hi") } func main() { var f func() f = myFunc f() // This calls the function value stored in f: myFunc in this example }</code>
In manchen Fällen ist es wünschenswert, eine automatische Parameterspeicherung für Funktionsaufrufe zu haben. Für bestimmte Funktionstypen kann dies durch die Einführung von Hilfsfunktionen mit identischen Signaturen erreicht werden, die parameterlose Funktionen zurückgeben. Diese Abschlüsse rufen die ursprüngliche Funktion mit den gespeicherten Parametern auf.
Reflection kann verwendet werden, um das manuelle Kopieren von Parametern zu vermeiden. Dabei geht es jedoch darum, die Funktion zu übergeben, anstatt sie aufzurufen, was den Prozess verlangsamt.
Bei der Verwendung von Methoden gibt es eine Ausnahme. Methodenwerte können eine Kopie des Empfängers speichern, was eine automatische Parameterspeicherung für Methodenaufrufe ermöglicht.
<code class="go">type myParams struct { format string i int s string } func (mp myParams) Call() { fmt.Printf(mp.format, mp.i, mp.s) } func main() { p := myParams{format: "%d %q\n", i: 1, s: "Hello, playground"} launch(p.Call) // p is saved here p.i, p.s = 2, "changed" time.Sleep(time.Second) }</code>
Hinweis: Keiner dieser Ansätze bietet eine exakte Übereinstimmung mit der gewünschten Funktionalität. Wenn sich die Parameter ändern können, ist ein manuelles Kopieren erforderlich, bevor die Funktion an einen Helfer übergeben wird, der die Parameter speichert.
Das obige ist der detaillierte Inhalt vonKönnen Sie in Go einen Typ für Funktionsaufrufe definieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!