2016-06-28 4 views
0

Im Moment bin ich in diesem Code stecken: https://play.golang.org/p/r_HEVmpOuDPanik: Schnittstelle Umwandlung: Obj ist nicht ObjInterface: fehlende Methode X

package main 

import "fmt" 

type (
    Collection struct { 
     Id string 
    } 
    CollectionInterface interface { 
     Process(...string) 
    } 
) 

func (this *Collection) Process(params ...string) { 
    this.Id = "ok" 

} 

func testfunc(input interface{}) CollectionInterface { 
    inputCol := input.(CollectionInterface) 
    inputCol.Process() 
    return inputCol 
} 

func makeInterface(input interface{}) interface{} { 
    return input 
} 

func main() { 
    test := Collection{Id: "ya"} 
    test.Process() 
    testInt := makeInterface(test) 

    test0 := testInt.(CollectionInterface) 
    test1 := testfunc(test0) 
    fmt.Println(test1) 
} 

Ich frage mich bin, wie kann ich die Schnittstelle umwandeln {} in CollectionInterface ohne die Funktion "Process" in eine statische Funktion zu ändern?

+2

Fügen Sie ein & in Zeile 31 hinzu: Collection implementiert kein Collection Interface (nur * Collection). Und: Mach die Tour of Go noch einmal. – Volker

+0

Ich bekomme tatsächlich die Schnittstelle von der Reflexion, ich habe gerade herausgefunden, dass die Art und Weise, um es Zeiger ist mit Add(). Interface() -Funktion zu bekommen. Ich hoffe, dass es Leuten hilft, die stecken geblieben sind, um Zeiger für Reflexionsschnittstelle zu bekommen. –

Antwort

-1

Sie tun es falsch. Ich mache kleine Änderungen, um es zu beheben. Lass es mich wissen, wenn du eine Frage hast.

https://play.golang.org/p/SEesgVhXt8

+0

Die Sache ist, ich bekomme die Schnittstelle {} von einer Reflexion. Weißt du, wie man den Zeiger mit Reflexion bekommt? (immer noch versuchen, die Reflexion herauszufinden) –

+0

Ok, ich habe es herausgefunden. Mit Add(). Interface() geben Sie mir den Zeiger, der mit & Variable identisch ist ... Sie sind eine Legende, vielen Dank .. war in dieser Ausgabe für 3 Tage haha ​​.. –

1

Ändern Sie diese Zeile test := Collection{Id: "ya"} dieser test := &Collection{Id: "ya"}. Die Schnittstelle ist für Typ *Collection implementiert; nicht Collection.

+1

Dies ist genau. Die Faustregel mit Schnittstellen ist, dass Wertmethoden die erforderlichen Schnittstellenmethoden entweder für einen Wert oder einen an die Schnittstelle übergebenen Zeiger erfüllen können, aber Zeigermethoden die Schnittstelle nur dann erfüllen können, wenn ein Zeiger an die Schnittstelle übergeben wird. Dies liegt vor allem daran, dass beim Übergeben eines Werts die Daten kopiert wurden, wenn sie in der Schnittstelle gespeichert wurden. Daher haben Zeigermethoden keinen Einfluss auf die ursprüngliche Version, die Sie übergeben haben, und sind daher nicht definiert. – Kaedys

Verwandte Themen