Problem:
In einem Go-Modul, das zum Laden von Plugins entwickelt wurde, Es ist wichtig sicherzustellen, dass im Hauptpaket eine bestimmte Funktion mit einem vorgegebenen Namen und einer vorgegebenen Signatur vorhanden ist. Fehlt diese Funktion oder entspricht sie nicht der erwarteten Signatur, ist eine beschreibende Fehlermeldung erforderlich. Wie kann bei gegebener Funktionstypvariable die zugrunde liegende Signatur erhalten werden?
Lösung:
Die bloße Verwendung von „reflect.Type.String()“ liefert nur den Namen des Typs. wie main.ModuleInitFunc. Um die vollständige Signatur abzurufen, müssen wir sie manuell anhand der von Reflect.Type bereitgestellten Informationen erstellen.
Implementierung:
func signature(f interface{}) string { t := reflect.TypeOf(f) if t.Kind() != reflect.Func { return "<not a function>" } buf := strings.Builder{} buf.WriteString("func (") for i := 0; i < t.NumIn(); i++ { if i > 0 { buf.WriteString(", ") } buf.WriteString(t.In(i).String()) } buf.WriteString(")") if numOut := t.NumOut(); numOut > 0 { if numOut > 1 { buf.WriteString(" (") } else { buf.WriteString(" ") } for i := 0; i < t.NumOut(); i++ { if i > 0 { buf.WriteString(", ") } buf.WriteString(t.Out(i).String()) } if numOut > 1 { buf.WriteString(")") } } return buf.String() }
Verwendung:
Indem wir eine Funktionsvariable an die Funktion „signatur()“ übergeben, können wir die entsprechende Signatur als String erhalten. Zum Beispiel:
var myFunc ModuleInitFunc fmt.Println(signature(func(i int) error { return nil })) fmt.Println(signature(myFunc)) fmt.Println(signature(time.Now)) fmt.Println(signature(os.Open)) fmt.Println(signature(log.New)) fmt.Println(signature(""))
Ausgabe:
func (int) error func (int) error func () time.Time func (string) (*os.File, error) func (io.Writer, string, int) *log.Logger <not a function>
Hinweis:
Es ist wichtig zu erkennen, dass es unmöglich ist um die Namen der Parameter und Ergebnistypen aus der Signatur zu extrahieren, da Go diese Informationen nicht speichert oder Zugriff darauf bietet.
Das obige ist der detaillierte Inhalt vonWie rufe ich die Signatur einer Go-Funktion als String ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!