go里面interface是什么概念

题目来源

答案:

go中的interface是一个类型,而且这个类型中包含的是函数,或者interface(这样就形成了嵌套),简单的说就是函数(或方法)的集合。
interface实际上就是一个结构体,包含两个成员。其中一个成员是指向具体数据的指针,另一个成员中包含了类型信息。空接口和带方法的接口略有不同,下面分别是空接口和带方法的接口使用的数据结构:

  1. struct Eface
  2. {
  3. Type* type;
  4. void* data;
  5. };
  6. struct Iface
  7. {
  8. Itab* tab;
  9. void* data;
  10. };
  • 注意
    (1) 接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)
    (2) 接口中所有的方法都没有方法体,即都是没有实现的方法。
    (3) 在Go中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。
    (4) 一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型。
    (5) 只要是自定义数据类型就可以实现接口,不仅仅是结构体类型。
    (6) 一个自定义类型可以实现多个接口。
    (7) Go接口不能有任何变量。
    (8) 一个接口可以继承多个别的接口,这时如果要实现这个接口必须实现它继承的所有接口的方法。在低版本的Go编辑器中,一个接口继承其他多个接口时,不允许继承的接口有相同的方法名。比如A接口继承B、C接口,B、C接口的方法名不能一样。高版本的Go编辑器没有相关问题。
    (9) interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil。
    (10) 空接口interface{}没有任何方法,所以所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口类型。

    参与讨论