方法提升
通过嵌入继承方法
方法提升 是 CoddyKit 上的免费 Go Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
通过嵌入继承方法
嵌入一个类型时,它的方法也会被提升。外层类型可以像调用自身定义的方法一样调用这些方法——这是 Go 风格的继承。
提升的方法
Car 嵌入 Engine,因此免费获得其 Start 方法。
package main
import "fmt"
type Engine struct{}
func (Engine) Start() { fmt.Println("engine started") }
type Car struct{ Engine }
func main() {
c := Car{}
c.Start()
}方法作用于嵌入的值
提升的方法会针对嵌入的字段运行,而不是外层结构体。它无法看到外层结构体的其他字段。
package main
import "fmt"
type Counter struct{ n int }
func (c *Counter) Inc() { c.n++ }
func (c Counter) Get() int { return c.n }
type Widget struct{ Counter }
func main() {
w := Widget{}
w.Inc()
w.Inc()
fmt.Println(w.Get())
}覆盖方法
在外层结构体上定义同名方法,即可覆盖提升的方法。外层方法优先。
package main
import "fmt"
type Animal struct{}
func (Animal) Speak() string { return "..." }
type Dog struct{ Animal }
func (Dog) Speak() string { return "Woof" }
func main() {
fmt.Println(Dog{}.Speak())
}调用嵌入类型的方法
即使覆盖后,您仍可通过嵌入类型名称访问原始方法。
package main
import "fmt"
type Animal struct{}
func (Animal) Speak() string { return "generic" }
type Dog struct{ Animal }
func (d Dog) Speak() string { return "Woof + " + d.Animal.Speak() }
func main() {
fmt.Println(Dog{}.Speak())
}提升与接口
由于提升的方法属于外层类型的方法集,外层类型可以使用嵌入类型的方法来满足接口。
package main
import "fmt"
type Stringer interface{ String() string }
type Base struct{ name string }
func (b Base) String() string { return b.name }
type Wrapper struct{ Base }
func main() {
var s Stringer = Wrapper{Base{"hi"}}
fmt.Println(s.String())
}指针与值的方法集
如果嵌入类型具有指针接收者方法,那么只有指向外层结构体的指针(或可寻址的值)才会将这些方法提升到其方法集。
使用嵌入提供默认行为
嵌入一个提供合理默认方法的类型,然后只覆盖需要定制的少数方法——这是强大的复用模式。
package main
import "fmt"
type DefaultHandler struct{}
func (DefaultHandler) Handle() string { return "default" }
type CustomHandler struct{ DefaultHandler }
func (CustomHandler) Handle() string { return "custom" }
func main() {
fmt.Println(CustomHandler{}.Handle())
}没有真正的多态
与经典面向对象编程不同,嵌入的方法不会分派回外层的覆盖方法。Go 不会通过嵌入进行虚方法分派。
跨多层进行提升
方法会传递性地提升:如果 A 嵌入 B,而 B 嵌入 C,那么 A 也会获得 C 的方法,只要不存在歧义。
提升的作用
- 无需重写即可复用行为
- 提供可以覆盖的默认行为
- 通过嵌入的方法满足接口
快速检查
请测试您对方法提升的了解。
回顾
您学习了方法提升。
- 嵌入的方法会提升到外层类型
- 外层方法会覆盖提升的方法
- 通过嵌入类型名称访问原始方法
- 提升有助于满足接口,但不存在虚方法分派
常见问题解答
「方法提升」课时是免费的吗?
是的 — 「方法提升」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「方法提升」这节课中我会学到什么?
通过嵌入继承方法 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「方法提升」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。