Heim  >  Artikel  >  Backend-Entwicklung  >  Können Sie in Go einen Typ für Funktionsaufrufe definieren?

Können Sie in Go einen Typ für Funktionsaufrufe definieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 11:49:02526Durchsuche

Can You Define a Type for Function Calls in Go?

Ist es möglich, einen Typ für Funktionsaufrufe in Go zu definieren?

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?

Kein direkter Typ für Funktionsaufrufe

Leider gibt es keinen solchen Typ Gehen. Das Verhalten von go und defer ist in die Sprachspezifikation integriert und wird vom Compiler erzwungen.

Funktionswerte als Variablen verwenden

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>

Nachahmung der automatischen Parameterspeicherung

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 zum Übergeben von Funktionen verwenden

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.

Einzelne Ausnahme: Methodenwerte

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn