嵌入与组合
struct 嵌入(不是继承)、接口嵌入、方法提升
嵌入与组合
Go 没有继承——通过 struct 嵌入和接口嵌入实现代码复用。"组合优于继承"在 Go 里不是建议,是唯一选项。
学完本章你将: 掌握 struct 嵌入、接口嵌入、方法提升。
struct 嵌入 —— 代码复用
go
package main
import "fmt"
type Logger struct{}
func (l Logger) Log(msg string) {
fmt.Println("[LOG]", msg)
}
type FileLogger struct {
Logger // 嵌入——FileLogger 自动拥有 Log 方法
filename string
}
func main() {
fl := FileLogger{filename: "app.log"}
fl.Log("服务器启动") // 直接调用嵌入类型的方法
// [LOG] 服务器启动
}
接口嵌入
go
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
// 组合接口
type ReadWriter interface {
Reader
Writer
}
// io.ReadWriter 就是这样定义的
方法提升与覆盖
go
type Base struct{}
func (b Base) Greet() string { return "Hello from Base" }
type Derived struct {
Base
}
// 覆盖嵌入类型的方法
func (d Derived) Greet() string {
return "Hello from Derived"
}
func main() {
d := Derived{}
fmt.Println(d.Greet()) // "Hello from Derived"
fmt.Println(d.Base.Greet()) // "Hello from Base"(直接访问被覆盖的方法)
}