Heim >Backend-Entwicklung >Golang >Wie kann ich in Go einen Funktionsabschnitt mit unterschiedlichen Signaturen erstellen?
Wie kann man in Go einen Funktionsabschnitt mit unterschiedlichen Signaturen erstellen?
Das Typsystem von Go ist statisch typisiert, was bedeutet, dass Funktionen eine feste Signatur haben müssen Kompilierzeit. Es kann jedoch nützlich sein, Slices von Funktionen zu erstellen, die Argumente verschiedener Typen oder Zahlen akzeptieren können.
Der bereitgestellte Code ist zwar funktionsfähig, erfordert jedoch die Verwendung einer Switch-Anweisung zur Verarbeitung jedes Arguments Funktionssignaturtyp. Eine prägnantere und flexiblere Lösung ist die Verwendung von Reflektion.
Hier ist ein Beispiel:
package main import ( "fmt" "reflect" ) type Executor func(...interface{}) func main() { functions := []Executor{ func(a, b int) { fmt.Println(a + b) }, func(s string) { fmt.Println(s) }, func() { fmt.Println("No arguments") }, } for _, f := range functions { numIn := reflect.TypeOf(f).NumIn() args := make([]reflect.Value, numIn) for i := 0; i < numIn; i++ { switch reflect.TypeOf(f).In(i).Kind() { case reflect.Int: args[i] = reflect.ValueOf(12) case reflect.String: args[i] = reflect.ValueOf("Hello") default: args[i] = reflect.Value{} } } f.Call(args) } }
In dieser Lösung erstellen wir einen Teil der Executor-Funktionen, das sind Funktionen, die eine beliebige Anzahl von Executor-Funktionen akzeptieren Argumente. Das Reflect-Paket wird verwendet, um die Anzahl und Art der von jeder Funktion erwarteten Argumente zu bestimmen und das entsprechende Reflect.Value-Slice zu generieren.
Die Verwendung von Reflection ermöglicht es uns, Funktionen mit unterschiedlichen Signaturen dynamisch aufzurufen, ohne dass ein Typwechsel erforderlich ist oder interface{}-Slices.
Das obige ist der detaillierte Inhalt vonWie kann ich in Go einen Funktionsabschnitt mit unterschiedlichen Signaturen erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!