2017-12-13 4 views
1

Ich lese, wie zu initialisieren , und eine verwandte Q&A.Embed eine Art von anderen pkg in meins, und initiiere es durch literal

Was mein Problem ist, wenn Sie diesen Code kompilieren, ich habe:

[Fehler] unbekanntes Feld 'feature.DefaultSshHelper' in struct wörtlichen vom Typ dala02

type FDH feature.DefaultSshHelper                                            

type dala02 struct {                                               
    Md5_v string                                                
    feature.DefaultSshHelper                                             
    //FDH                                                  
}                                                    

var x_01_h1_p = &dala02{                                              
    Md5_v: "",                                                
    feature.DefaultSshHelper: feature.DefaultSshHelper{                                      
     //FDH: FDH{ 
      // blabla 
    }, 
} 
// use it by a interface []feature.CmdFioHelper{x_00_h1_p}   

zum ersten Mal, ich dachte, es war ein exportiertes Problem, also habe ich diese Zeile 'Type FDH feature.DefaultSshHelper' hinzugefügt. Jetzt haben wir diesen Fehler:

[Fehler] nicht verwenden x_01_h1_p (Typ * dala02) als Typ feature.CmdFioHelper in Array oder Slice wörtlichen: * dala02 nicht implementiert feature.CmdFioHelper (fehlende Getnextchecker Methode)

Aber ein Zeiger von feature.DefaultSshHelper implementiert feature.CmdFioHelper (eine Schnittstelle). Also Zeiger von dala02 sollte das auch umsetzen, oder? (Referenzform effektiv go)

Es gibt einen wichtigen Weg, bei dem sich die Einbettung von der Unterklasse unterscheidet. Wenn wir einen Typ einbetten, werden die Methoden dieses Typs zu Methoden des äußeren Typs, aber wenn sie aufgerufen werden, ist der Empfänger der Methode der innere Typ, nicht der äußere.

Frage ist, wie dieser Kompilierfehler behoben wird, welche Zeile falsch ist? Ich bin kein Experte für Golang, vielen Dank für Ihren Rat :). BTW Ich finde einige Abhilfe.

Antwort

3

Wenn Sie auf eingebettete Felder verweisen, müssen Sie den Paketnamen des eingebetteten Typs weglassen, da der Name des nicht qualifizierten Typs als Feldname fungiert.

Spec: Struct types:

Ein Feld mit einem Typ, aber keine expliziten Feldnamen genannt ein anonymes Feld, auch in der Struktur eingebettet Feld oder eine Einbettung des Typs deklariert ist. Ein eingebetteter Typ muss als Typenname T angegeben werden oder als Zeiger auf einen Nicht-Schnittstellentypnamen *T und T selbst darf kein Zeigertyp sein. Der Name des nicht qualifizierten Typs dient als Feldname.

So einfach schreiben:

var x_01_h1_p = &dala02{ 
    Md5_v:   "", 
    DefaultSshHelper: feature.DefaultSshHelper{ 
    // blabla 
    }, 
} 

Ihre anderen Versuch type FDH feature.DefaultSshHelper als diese Typdeklaration einen neuen Typ mit Null Methoden schafft kurze fällt: die Art FDH nicht die Methoden der feature.DefaultSshHelper „erben“. Und so wird jedem Typ, der FDH enthält, auch Methoden feature.DefaultSshHelper fehlen.

+0

Danke für Ihre Antwort. –

Verwandte Themen