Đã có câu trả lời tốt ở đây. Hãy để tôi thêm cái riêng của mình cho những người khác muốn hiểu nó bằng trực giác:
Giao diện
Đây là một giao diện với một phương thức:
type Runner interface {
Run()
}
Vì vậy, bất kỳ loại nào có Run()
phương thức đều thỏa mãn giao diện Runner:
type Program struct {
/* fields */
}
func (p Program) Run() {
/* running */
}
func (p Program) Stop() {
/* stopping */
}
Mặc dù loại Chương trình cũng có phương thức Dừng, nhưng nó vẫn thỏa mãn giao diện Người chạy vì tất cả những gì cần thiết là có tất cả các phương thức của giao diện để đáp ứng.
Vì vậy, nó có một phương thức Run và nó đáp ứng giao diện Runner.
Giao diện trống
Đây là một giao diện trống có tên mà không có bất kỳ phương thức nào:
type Empty interface {
/* it has no methods */
}
Vì vậy, bất kỳ loại thỏa mãn giao diện này. Bởi vì, không có phương pháp nào là cần thiết để đáp ứng giao diện này. Ví dụ:
// Because, Empty interface has no methods, following types satisfy the Empty interface
var a Empty
a = 5
a = 6.5
a = "hello"
Nhưng, loại chương trình trên có đáp ứng nó không? Đúng:
a = Program{} // ok
giao diện {} bằng với giao diện rỗng ở trên.
var b interface{}
// true: a == b
b = a
b = 9
b = "bye"
Như bạn thấy, không có gì bí ẩn về điều đó nhưng nó rất dễ bị lạm dụng. Tránh xa nó nhiều như bạn có thể.
https://play.golang.org/p/A-vwTddWJ7G
interface{}
ít nhiều tương đương vớivoid *
C. Nó có thể trỏ đến bất cứ thứ gì và bạn cần một xác nhận cast / type để sử dụng nó.