Ich habe diesen Beispiel-CodeGolang Methode mit Zeigern Empfänger
package main
import (
"fmt"
)
type IFace interface {
SetSomeField(newValue string)
GetSomeField() string
}
type Implementation struct {
someField string
}
func (i Implementation) GetSomeField() string {
return i.someField
}
func (i Implementation) SetSomeField(newValue string) {
i.someField = newValue
}
func Create() IFace {
obj := Implementation{someField: "Hello"}
return obj // <= Offending line
}
func main() {
a := Create()
a.SetSomeField("World")
fmt.Println(a.GetSomeField())
}
SetSomeField
nicht wie erwartet funktioniert, weil sein Empfänger nicht von Zeigertyp ist.
Wenn ich die Methode auf einen Zeiger Empfänger zu ändern, was ich erwarten würde, zu arbeiten, sieht es wie folgt aus:
func (i *Implementation) SetSomeField(newValue string) { ...
Kompilieren dies zu folgendem Fehler führt:
prog.go:26: cannot use obj (type Implementation) as type IFace in return argument:
Implementation does not implement IFace (GetSomeField method has pointer receiver)
Wie kann Ich habe die struct
implementieren die Schnittstelle und die Methode SetSomeField
den Wert der tatsächlichen Instanz ändern, ohne eine Kopie zu erstellen?
Hier ist ein hackable Schnipsel: https://play.golang.org/p/ghW0mk0IuU
ich diese Frage schon In go (golang), how can you cast an interface pointer into a struct pointer? gesehen habe, aber ich kann nicht sehen, wie es zu diesem Beispiel verwendet ist.
Beide Methoden erfordern Zeiger Empfänger, sonst sind Sie nur einen Teil der Schnittstelle implementiert. – elithrar