Golang

Part 1

Posted by Dingding on July 28, 2019

接口是一种特殊的Struct

  • 不能有字段
  • 不能定义自己的方法
  • 只能声明方法,不能实现
  • 可嵌入其他类型的接口

执行机制

接口使用一个名为itab的结构体存储运行期所需要的相关类型信息

type iface struct{ //只有这两个字段都为nil,接口才为nilj
	tab *itab//类型信息
	data unsafePointer //实际对象指针
}

type itab struct {
	inter *interfacetype //接口类型
	_type*_type//实际对象类型
	fun [1]uintptr//实际对象方法地址
}

重要特征

  • 将对象赋值给接口变量时,会复制该对象
  • 将对象指针赋值给接口变量时,只会复制该对象地址
  • 无法修改接口对象,甚至无法修改接口对象的复制品

方法自动生成

  • 会根据receiver T 方法自动生成receiver *T方法
  • 不会根据receiver *T 方法自动生成receiver T方法
    func (a T)myMethod()bool
    ->
    func(a* T)myMethod()bool
    

方法集

方法集仅影响接口实现和方法表达式转换,与通过实例或者指针调用方法无关.实例或者指针并不实用方法集,而是直接调用.

  • 类型 T 的方法集包含了所有的 reciever T 的方法
  • 类型 T 的方法集包含了所有的 Receiver T 和 ReceiverT 的方法
  • 匿名嵌入 S ,T方法集包含所有 receiver S 的方法
  • 匿名嵌入 *S,T方法集包含所有 receiver S 和 Receiver *S 的方法
  • 匿名嵌入 S 或者 S ,T 方法集包含所有 receiver S 和 Receiver *S 的方法