跳到主要内容

类型嵌入与方法提升

方法提升

概念

  • embedded type: struct 嵌入字段的方法可提升到外层类型;
  • 方法提升: 外层值可直接调用嵌入字段的方法;
  • 嵌入字段名: 默认使用类型名;

语法格式

package main

type Logger struct{}

func (Logger) Log() {
println("log")
}

type Service struct {
Logger // 嵌入字段,字段名默认是类型名 Logger
}

func main() {
s := Service{}
s.Log() // 方法提升,等价于 s.Logger.Log()
s.Logger.Log() // 显式通过嵌入字段调用
}

选择器歧义

概念

  • 冲突来源: 不同嵌入字段的同名方法或字段;
  • 消除歧义: 显式选择具体嵌入字段;

语法格式

type Metrics struct{}

func (Metrics) Log() {
println("metrics")
}

type App struct {
Logger // Logger 有 Log 方法
Metrics // Metrics 也有 Log 方法
}

func main() {
a := App{}
// a.Log() // 报错:Logger.Log 与 Metrics.Log 同名,选择器歧义
a.Logger.Log() // 明确选择 Logger 的 Log 方法
a.Metrics.Log() // 明确选择 Metrics 的 Log 方法
}