Heim >Backend-Entwicklung >Golang >Wie kann ich in Go einen Funktionsabschnitt mit unterschiedlichen Signaturen erstellen?

Wie kann ich in Go einen Funktionsabschnitt mit unterschiedlichen Signaturen erstellen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-26 05:01:10389Durchsuche

How Can I Create a Slice of Functions with Different Signatures in Go?

Erstellen eines Funktionsabschnitts mit unterschiedlichen Signaturen

Problem

Wie kann man in Go einen Funktionsabschnitt mit unterschiedlichen Signaturen erstellen?

Kontext

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.

Lösung

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!

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