Golang leere Schnittstelle {} im Funktionstyp

8

Ein Objekt eines beliebigen Typs kann einer leeren Schnittstelle zugewiesen werden. Zum Beispiel haben wir die folgende Funktion

%Vor%

Wir können es durch

nennen %Vor%

Aber ich kann nicht dasselbe für den Funktionstyp

erreichen %Vor%

Ich kann das nicht mit
Map( func( i int) {......} )
aufrufen weil der Typ func (int) sich vom Typ func (Schnittstelle {}) unterscheidet.

Aber wenn ich func (interface {}) definiere, meine ich wirklich jede Art von Eingabeparametern. Wie kann ich das in Golang erreichen?

    
Yiqun Hu 01.10.2014, 06:18
quelle

1 Antwort

11

Es schlägt fehl, weil die Signaturen nicht übereinstimmen.

Wenn Sie Println(3) aufrufen, verwendet die Funktion keine Ganzzahl als erstes Argument. Stattdessen wird die ganze Zahl in eine interface{} Variable gepackt (eine automatische Konvertierung, da Integer der Schnittstelle entsprechen), und diese Variable wird an die Funktion übergeben. Diese Konvertierung findet auf der aufrufenden Seite statt. Daher unterscheidet sich der Aufruf der Funktion vom Aufruf einer Funktion, die mit func(i int) übereinstimmt.

Wenn Sie eine Funktion schreiben möchten, die willkürliche unäre Funktionen akzeptiert, müssen Sie sie deklarieren, um eine interface{} Variable als Argument zu verwenden und dann den Wert mit dem reflect -Paket zu überprüfen. Das Paket reflect kann Ihnen auch dabei helfen, beliebige Funktionen aufzurufen, bei denen Sie die Signatur zum Zeitpunkt der Kompilierung nicht kennen.

Zum Beispiel:

%Vor%

Dies ruft die angegebene Funktion f mit dem Argument v auf und gibt das Ergebnis zurück. Wenn v dem ersten Argument von f zuweisbar ist, wird der Aufruf ohne Panik gelingen. Sie können mit diesem Beispiel hier experimentieren: Ссылка

    
James Henstridge 01.10.2014 06:48
quelle

Tags und Links