go:interface(接口)

1. 定义

  接口定义了一组抽象方法(方法集);

  接口中不能定义变量;

type Namer interface {
    Method1(param_list) return_type
    Method2(param_list) return_type
    ...
}

  永远不要使用一个指针指向一个接口类型,因为它已经是一个指针

1.1 接口名称

  1. 一般以方法名加 [e]r 后缀结尾,比如 Printer、Reader、Writer、Logger;

  2. 以 able 后缀结尾,如 Closeable、Cloneable;

  3. 以 I 开头(大写的i);

1.2 接口方法

  一般接口中的方法比较少,0-3个;

2. 接口类型

  go 中的接口一般有两种,一种是包含方法定义的接口,一种是不包含方法定义的空接口;

  go 语言实现时用两种结构体表示不同的接口,iface 结构体表示包含方法定义的接口,eface 结构体表示空接口;

3. 接口实现方式

  在Java中,实现 接口时通过 implements  接口名 来显示实现接口,并在实现类中实现接口的所有方法;

  在 go 中,接口都是隐式实现的,实现类只需要实现接口中的全部方法就隐式实现了这个接口;

3.1 接口方法的实现和调用

  接口的方法定义中没有限制方法的接收者为结构体还是结构体指针,接收者类型两者都可以,只能二选一;

  根据方法接收者类型和方法传入的参数情况,有以下几种情况:

  

  接收者类型和传入参数类型相同时编译通过理所当然,下面讨论一下两种类型不同的情况;   

  1. 当接收者类型为结构体时,传入结构体指针编译通过,指针编译通过是因为指针通过解引用可以得到引用指向的结构体;

  2. 当接收者类型为结构体指针时,传入结构体编译不通过,因为通过结构体不能找到唯一确定的结构体指向的指针,(纯属瞎猜,这里有答案,没看懂,手动狗头)

4. 接口嵌套

  类似Java中的接口继承;

  一个接口可以包含一个或者多个其他类型的接口,此时相当于该接口也定义了内嵌接口的方法;

  比如接口 File包含了ReadWrite 和 Lock 的所有方法,它还额外有一个 Close() 方法。

type ReadWrite interface {
    Read(b Buffer) bool
    Write(b Buffer) bool
}

type Lock interface {
    Lock()
    Unlock()
}

type File interface {
    ReadWrite
    Lock
    Close()
}
原文地址:https://www.cnblogs.com/virgosnail/p/12971086.html