2016-04-10 10 views
1

Wenn ich die Sprache lernen, war ich verwirrt durch interface{} parameterGolang Schnittstelle {} Parameter wie Pass Wert beurteilen oder Zeiger übergeben

zum Beispiel verwende ich den net/rpc

die Schnittstelle:

// description: Call invokes the named function, waits for it to complete, and returns its error status. 
func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error 

ich nur die Antwort Parameter als Wert übergeben, wird das Programm Fehler:
rpc call error:reading body gob: attempt to decode into a non-pointer

so, wie zu unterscheiden, wenn ich Zeiger übergeben oder Wert für die Schnittstelle übergeben sollte.

Antwort

1

Der interface{} Typ für ein Funktionsargument gibt an, dass Sie Wert mit einem beliebigen Typ an dieses Argument übergeben können. Das liegt daran, dass alle Typen interface{} (leere Schnittstelle) implementieren. Dies beinhaltet auch einen Zeigertyp.

Aus diesem Grund können Sie nicht beurteilen, ob Sie Zeiger oder Wert auf der Basis der interface{} Typ-Deklaration dieses Arguments allein übergeben müssen. Weil es beides akzeptiert. Also, Sie müssen die Dokumentation der spezifischen Funktion konsultieren und sehen, was der Autor erwartet.

In Ihrem Fall ist der Fehler definiert um https://golang.org/src/encoding/gob/decoder.go Wie der Fehler sagt, benötigen Decoder einen Zeiger für die reply parameter. Andernfalls wird die reply nicht zurück zum Anrufer.