2016-11-25 42 views
6

czytam o spec selektorów: https://golang.org/ref/spec#SelectorsGolang: Dlaczego selektor do wskaźników jest niedozwolony po porównaniu?

enter image description here

Dlaczego q.M0() jest nieprawidłowy. Chociaż p.M0() jest ważny i q=p. Bardzo dziwne dla mnie.

Odpowiedni kod źródłowy:

type T0 struct { 
    x int 
} 

func (*T0) M0() 

type T1 struct { 
    y int 
} 

func (T1) M1() 

type T2 struct { 
    z int 
    T1 
    *T0 
} 

func (*T2) M2() 

type Q *T2 

var t T2  // with t.T0 != nil 
var p *T2 // with p != nil and (*p).T0 != nil 
var q Q = p 

p.M0()  // ((*p).T0).M0()  M0 expects *T0 receiver 
q.M0()  // (*q).M0 is valid but not a field selector 
+0

Wiem, że dokumentacja to wyjaśnia. Ale proszę, nie odrzucajcie. Jeśli pytam, to znaczy, że próbowałem zrozumieć i nie odniosłem sukcesu. Wiem 2 rzeczy: * 1. * Ludzie tutaj lubią powtarzać pytania "golang". * 2. * Ludzie tutaj mają silniejszą zdolność do wyjaśniania skomplikowanych rzeczy w języku Markdown. – Aminadav

Odpowiedz

7

Why q.M0() is invalid. While p.M0() is valid and q=p . Very strange for me.

q jest inicjowany jak var q Q = p, ale to nie znaczy, że są równe. Numer assignment jest ważny, ponieważ nie narusza reguł assignability, ale typ q jest inny niż typ p.

Rodzaj q jest Q (gdzie type Q *T2) oraz rodzaj p jest *T2.

W programie Go metody należą do określonego typu. Po wykonaniu tej czynności:

type Q *T2 

Tworzy nowy typ o nazwie Q (*T2 jest jego podstawowej typu). Nowy typ będzie miał 0 metod, to nie „dziedziczą” wszelkie metody z *T2, stąd q.M0() będzie błąd kompilacji:

q.M0 undefined (type Q has no field or method M0)

Uwaga:

Możesz nadal uważam, że to dziwne bo M0() jest zadeklarowana następująco:

func (*T0) M0() 

ma *T0 odbiornik tak, że należy do typu *T0 jeszcze typ z p jest *T2, więc *T2 nie powinien mieć tej metody M0(), a zatem p.M0() również powinien być nieprawidłowy. Ale T2 jest strukturą, która w ten sposób jest promowana w postaci ,,i.

Zobacz także powiązane pytanie: Golang: Why selector to pointers is illegal after comparison?

+0

Dzięki. Naprawdę pomocny – Aminadav

Powiązane problemy