Warum lege ich einem Typ Assertion-Ergebnis einen Wert zu, wo die Schnittstelle von einem Zeiger zugewiesen wird, und es kommt zu einem "nicht zuordnen" -Fehler, wenn ich es auf eine Schnittstelle, die von einem Strukturobjekt zugewiesen ist, tun?Golang Typ Assertion, was ist der Unterschied zwischen Schnittstelle {} (Zeiger) und Schnittstelle {} (Objekt)?
Hier ist mein Code:
package main
import (
"fmt"
)
type Person interface {
SayHi()
}
type Student struct {
id int
name string
}
func (s Student) SayHi() {
fmt.Println("hi, i am", s.name, " my id is:", s.id)
}
func main() {
p1 := Person(&Student{id: 123, name: "William"})
p1.SayHi() // ok
p1.(*Student).SayHi() // ok here
p1.(*Student).id = 456 // ok here
p2 := Person(Student{id: 123, name: "William"})
p2.SayHi() //ok
p2.(Student).SayHi() // ok here
p2.(Student).id = 456 // error here and why?
fmt.Println("p1:", p1, " p2:", p2)
}
https://play.golang.org/p/dwkvLzng_n
'p2. (Student)' erzeugt eine Art temporäres Objekt (Kopie), das sofort entsorgt wird. Was ist der Zweck der Zuordnung zu ihm? – myaut
Ich bin eine neue Biene bei Golang, ich versuche, etwas intrinsisch über die Sprache besser bekannt zu bekommen –
Wenn Sie Einblick in Go erhalten möchten: Beenden Sie versuchen Vererbung-Design. Go unterstützt das nicht und du wirst dich verletzen. – Volker