2017-05-20 3 views
0

I-Code, der folgende Struktur hat:Schnittstelle hat kein Feld oder eine Methode für eine exportierte Feld in einer Struktur

// $GOPATH/experiments/interfaceexport/printer/printer.go 
package printer 

import "fmt" 

type ResourcePrinter interface { 
    PrintSomething() 
} 

type JSONPrinter struct { 
    IsGeneric bool 
} 

func (printer *JSONPrinter) PrintSomething() { 
    fmt.Println("JSON") 
} 

// $GOPATH/experiments/interfaceexporter/printerretriever/printerretriever.go 
package printer 

import "experiments/interfaceexporter/printer" 

func GetPrinter() printer.ResourcePrinter { 
    return &printer.JSONPrinter{IsGeneric: true} 
} 


// $GOPATH/experiments/interfaceexport/main.go 
import "experiments/intefaceexport/printerretriever" 

func main() { 
    printer := printerretriever.GetPrinter() 

    printer.PrintSomething() // "JSON" 
    // interfaceexport/main.go:13: printer.IsGeneric undefined (type printer.ResourcePrinter has no field or method IsGeneric) 
    if printer.IsGeneric { 
    printer.PrintSomething() 
    } 
} 

Wenn ich go run main.go erhalte ich Fehler folgende:

interfaceexport/main.go:13: printer.IsGeneric undefined (type printer.ResourcePrinter has no field or method IsGeneric)

Warum erhalte ich den obigen Fehler, obwohl IsGeneric exportiert wird?

Antwort

5

printer.ResourcePrinter ist eine Schnittstelle, nicht die eigentliche Instanz JSONPrinter, die IsGeneric Zugriff hat

Sie benötigen würde eine Methode IsGeneric() zu Ihrer Schnittstelle hinzuzufügen (und implementieren sie in JSONPrinter) um in der Lage zu sein, zu verwenden diese Schnittstelle wie du willst.

Siehe „golang how to access interface fields“: Sie auch den dynamischen Wert durch die Schnittstelle Variable durch eine Art Behauptung gehalten extrahieren könnte:

dynamic_value := printer.(JSONPrinter) 

Dann dynamic_value würde Zugriff auf das IsGeneric Attribut haben.

Weitere Informationen finden Sie unter "".


Even though compiler knows that printer.ResourcePrinter is an interface, it says that IsGeneric could also be a field.

Der dynamische Wert der Schnittstelle kann Feld haben (siehe „Get all fields from an interface“)

Das kein Feldteil, wenn sie auf an interface angewendet, auf eine eingebettete Art beziehen, den Namen des uneingeschränkten Typ fungiert als Feldname.

type ReadWriter interface { 
    Read(b Buffer) bool 
    Write(b Buffer) bool 
} 

type File interface { 
    ReadWriter // same as adding the methods of ReadWriter 
    Locker  // same as adding the methods of Locker 
    Close() 
} 

Sie sehen auch diese Art der Fehlermeldung, wenn ein Zeiger an eine Schnittstelle (wenn die Schnittstelle selbst einen Zeiger der Art umfasst: „Go: What's the meaning of interface{}?“ und „Cast a struct pointer to interface pointer in Golang“)

Siehe issue 10700

When using a new, unfamiliar package, programmers occasionally make the error of using a pointer to an interface type instead of the interface type directly.

+0

Alternative Vorgehensweise: http://Stackoverflow.com/a/26027902/6309 – VonC

+0

Ich denke, ich habe ein Rindfleisch mit "hat kein Feld" Feld Teil in der Fehlermeldung. Obwohl der Compiler weiß, dass printer.ResourcePrinter eine Schnittstelle ist, heißt es, dass IsGeneric auch ein Feld sein könnte. AFAIK gibt es keinen Weg in Go kann man Felder wie Strukturen für Schnittstellen definieren. – Waseem

0

Einfach, Ihre Schnittstelle hat keine Methode IsGeneric:

type ResourcePrinter interface { 
    PrintSomething() 
} 
Verwandte Themen