Z
ZHANK
方法与接口

嵌入与组合

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"(直接访问被覆盖的方法)
}