Go 接口的实现规则

2025-04-07  本文已影响0人  hehehehe

在 Go 语言中,接口的实现规则取决于方法的接收者类型(值接收者 (T) 还是 指针接收者 (*T))。具体规则如下:


1. 值接收者 (T) 实现接口

如果方法使用 值接收者func (t T) Method()),那么:

示例

type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
}

// 值接收者
func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

func main() {
    var s Shape

    // ✅ 可以用 Circle(值类型)
    c1 := Circle{Radius: 5}
    s = c1  // 正确
    fmt.Println(s.Area())

    // ✅ 也可以用 *Circle(指针类型)
    c2 := &Circle{Radius: 10}
    s = c2  // 也正确
    fmt.Println(s.Area())
}

结论:值接收者的方法,T*T 都算实现了接口。


2. 指针接收者 (*T) 实现接口

如果方法使用 指针接收者func (t *T) Method()),那么:

示例

type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
}

// 指针接收者
func (c *Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

func main() {
    var s Shape

    // ❌ 不能用 Circle(值类型)
    c1 := Circle{Radius: 5}
    s = c1  // 编译错误:Circle does not implement Shape (Area method has pointer receiver)

    // ✅ 必须用 *Circle(指针类型)
    c2 := &Circle{Radius: 10}
    s = c2  // 正确
    fmt.Println(s.Area())
}

结论:指针接收者的方法,只有 *T 算实现了接口T 不算。


3. 为什么 Go 这样设计?


4. 如何选择接收者类型?

情况 推荐接收者类型
方法不需要修改结构体 值接收者 (T)(更通用)
方法需要修改结构体 指针接收者 (*T)
结构体较大(避免复制开销) 指针接收者 (*T)
需要强制使用指针(如实现接口) 指针接收者 (*T)

5. 总结

方法接收者 实现接口的类型 赋值给接口的方式
(T) Method() T*T var s Shape = T{}var s Shape = &T{}
(*T) Method() *T var s Shape = &T{}(不能用 T{}

记住

这样设计是为了保证代码的安全性和一致性。🚀

上一篇 下一篇

猜你喜欢

热点阅读