2017-03-10 1 views
0

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

+2

'p2. (Student)' erzeugt eine Art temporäres Objekt (Kopie), das sofort entsorgt wird. Was ist der Zweck der Zuordnung zu ihm? – myaut

+0

Ich bin eine neue Biene bei Golang, ich versuche, etwas intrinsisch über die Sprache besser bekannt zu bekommen –

+0

Wenn Sie Einblick in Go erhalten möchten: Beenden Sie versuchen Vererbung-Design. Go unterstützt das nicht und du wirst dich verletzen. – Volker

Antwort

1

das Ergebnis value.(typeName) ist ein neuer (Kopie) Wert mit dem statischen Typ typeName.

p2.(Student).id=456 erstellt einen temporären Wert Student, alle Änderungen dieses Werts würden verworfen. Also lässt die Sprache diesen Fehler einfach nicht zu.

Verwandte Themen