2016-07-18 17 views
3

Basierend auf verschiedenen Beispielen, die im Internet und in der Antwort auf this SO Frage, ich versuche, herauszufinden, wie es auch für Typ ExitError von Paket os/exec zur Unterstützung der Sys() Verfahren möglich ist, wenn die Dokumentation nur die Error() Methode für diesen Typ erwähnt.Wie kann der Go-Typ ExitError im Paket os/exec die Sys() - Methode unterstützen, wenn sie nicht in der Dokumentation enthalten ist?

Ich habe gedacht, dass die Sys() Verfahren in Frage Typ ist Process in Paket os, aber wie funktioniert ExitError bekommen, es zu benutzen direkt (exiterror.Sys()), ohne die volle zu verwenden (exiterror.ProcessState.Sys())? *ExitError

Dies muss eine grundlegende Go Frage, aber ich habe noch, um die Antwort herauszufinden, diese eine meiner eigenen ...

Antwort

2

cmd.Wait() bereits Fehler des Typs zurückgibt. Wenn Sie bei ExitError ‚s Definition anschaut, kann man sehen, dass es *os.ProcessState bettet:

type ExitError struct { 
     *os.ProcessState 
     // other fields 
} 

Es ist durch *os.ProcessState, dass ein Wert vom Typ ExitErrorSys() Methode aufrufen kann.

Beachten Sie, dass innerhalb der Definition von ExitError, gibt es keine Feldnamen mit *os.ProcessState verbunden, was bedeutet, dass ein Wert vom Typ ExitError jede Methode direkt aufrufen können auf *os.ProcessState (Art wie Vererbung, wo ExitError*os.ProcessState erbt. Aber das ist nur um Ihnen eine sehr grundlegende Idee zu geben. Lesen Sie die Dokumentation zur Klärung.) solange es keine Methode auf ExitError mit dem gleichen Namen definiert ist.

Es gibt natürlich mehr dazu. Sie können darüber lesen here.

+1

A-ha! Mein Problem war zweifach: 1) Ich hatte nicht die Tatsache aufgegriffen, dass '* os.ProcessState' ein anonymes Feld war, und dass 2) dies bedeutete, dass 'ExitError' daher '* os.ProcessState' "vererbte" Felder und Methoden über die Einbettung. Der letzte Link, den Sie eingefügt haben, hat mich in die richtige Richtung gelenkt und mich dazu gedrängt, nach weiteren Informationen zu diesem Thema zu suchen. Mir ist jetzt klar, wie das geht. Die Art, wie ich es jetzt verstehe, ist, dass 'exitror.Sys()' eine "Verknüpfung" zu 'exiterror.ProcessState.Sys()' ist, weil es eingebettet ist. Vielen Dank! –