Tôi nghĩ câu trả lời cho câu hỏi này cần phải có cách tiếp cận hướng tới ngữ pháp hơn và cách thực hiện nó thông qua kỹ nghệ phần mềm. (Xin lỗi các quá đơn giản hóa)
Lần đầu tiên một đoạn hồi tưởng nhanh chóng của những gì types
?
Chúng chỉ là các khối bộ nhớ với logic trình biên dịch ở trên cùng. Điều gì làm cho một array
khác với một string
là trình biên dịch cho phép chúng ta làm gì với các khối bộ nhớ đó. (Hãy suy nghĩ sâu hơn và bạn có thể bắt đầu nhận ra sự khác biệt thực sự giữa các ngôn ngữ strongly typed
và dynamically typed
.)
Bây giờ, bạn cần nhận ra rằng các con trỏ là kiểu riêng của chúng.
*variable
là một khối bộ nhớ khác (còn gọi là loại) hơn variable
. Nó chỉ là trình biên dịch luôn luôn giả định rằng nội dung của *variable
luôn là một địa chỉ cho một khối bộ nhớ kiểu ở bên phải của khai báo cùng với các hạn chế/tính năng khác mà nó áp đặt.
Sau đó, hãy tóm tắt lại giao diện là gì.
Định nghĩa khoa học giả: Một tập hợp các yêu cầu cho bất kỳ công dân hạng nhất nào thuộc một loại cụ thể. Dịch sang các phần mềm engineering- bất kỳ khối bộ nhớ (các loại) có cấu trúc bộ nhớ cùng (nghĩ lại structure packing) liên quan đến nó như mô tả trong hợp đồng (interface
) có thể được thông qua xung quanh như với tên loại rằng hợp đồng đề cập.
Bây giờ bạn có thể bắt đầu nhận ra rằng khi bạn nói
func (f *Faz) Bar() string
là 'khối của bộ nhớ giữ một chức năng, nơi f
' f
s loại là một con trỏ đến Faz
nơi các khu vực
func (f Faz) Bar() string
là khối bộ nhớ của f
, trong đó f
là loại Faz
Vì vậy, khi bạn nói rằng biến số *Faz
thỏa mãn hợp đồng, thì làm cách nào bạn có thể giả định rằng biến số Faz
sẽ đủ điều kiện làm loại giao diện trong mã? Chọn người thỏa mãn hợp đồng của bạn và chỉ loại đó có thể giả định loại giao diện trong mã của bạn.
[Xem bài đăng này] (http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go). –
Giống như một lưu ý phụ: bài viết được tham chiếu bởi @KerrekSB rất hữu ích cho tôi khi hiểu rằng khi Go phàn nàn "MyFoo không thực hiện Foo (phương thức Bar có bộ nhận con trỏ)", điều đó không có nghĩa là bạn không thể sử dụng một người nhận con trỏ. Nó có nghĩa là một trong hai _none_ của các phương thức 'MyFoo' thực hiện' Bar' sẽ có bộ thu con trỏ, hoặc _all_ của chúng phải. Đó là một vấn đề khác với @ 0xor1, nhưng những người khác có thể tìm thấy câu hỏi này bởi vì họ đang trộn các kiểu người nhận của họ (như tôi) và không hiểu được lỗi họ đang gặp phải. – Hephaestus