2016-11-25 66 views
6

Tôi đang đọc spec về selectors: https://golang.org/ref/spec#SelectorsGolang: Tại sao bộ chọn cho con trỏ là bất hợp pháp sau khi so sánh?

enter image description here

Tại sao q.M0() không hợp lệ. Trong khi p.M0() hợp lệ và q=p. Rất lạ đối với tôi.

Mã nguồn liên quan:

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

Tôi biết rằng tài liệu giải thích nó. Nhưng xin đừng downvote. Nếu tôi hỏi, điều đó có nghĩa là tôi đã cố gắng hiểu và không thành công. Tôi biết 2 điều: * 1. * Mọi người ở đây thích downvote 'golang' câu hỏi. * 2. * Người dân ở đây có khả năng mạnh mẽ hơn để giải thích những điều phức tạp trong ngôn ngữ Markdown. – Aminadav

Trả lời

7

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

q được khởi tạo như var q Q = p, nhưng nó không có nghĩa là họ đều bình đẳng. assignment hợp lệ vì nó không vi phạm các quy tắc assignability, nhưng loại q khác với loại p.

Loại qQ (nơi type Q *T2), và loại p*T2.

Trong phần Go, các phương pháp thuộc về một loại cụ thể. Khi bạn làm điều này:

type Q *T2 

Nó tạo ra một loại mới có tên Q (*T2 là loại cơ bản của nó). Loại mới sẽ có 0 phương pháp, nó không "thừa hưởng" bất kỳ phương pháp từ *T2, do đó q.M0() sẽ là một lỗi thời gian biên dịch:

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

Lưu ý:

Bạn vẫn có thể nghĩ rằng nó là lạ vì M0() được khai báo như thế này:

func (*T0) M0() 

nó có *T0 nhận để nó thuộc về loại *T0, tuy nhiên loại của p*T2, do đó, *T2 không được có phương thức M0() và do đó p.M0() cũng phải không hợp lệ. Nhưng T2 là cấu trúc mà embeds*T0 và do đó các phương pháp của *T0được quảng bá và chúng sẽ nằm trong số method set của T2.

Cũng thấy câu hỏi liên quan này: Golang: Why selector to pointers is illegal after comparison?

+0

Cảm ơn. Thực sự hữu ích – Aminadav

Các vấn đề liên quan