美文网首页
Go 接口的实现规则

Go 接口的实现规则

作者: hehehehe | 来源:发表于2025-04-07 11:59 被阅读0次

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


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

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

  • T*T 都算实现了接口(Go 会自动解引用指针)。
  • 赋值给接口时,可以用 T*T

示例

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()),那么:

  • 只有 *T 算实现了接口T 不算。
  • 赋值给接口时,必须用 *T,不能用 T(否则编译错误)。

示例

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 这样设计?

  • 值接收者 (T)
    • 方法不会修改原对象(因为是副本)。
    • Go 允许 T*T 都实现接口,更灵活。
  • 指针接收者 (*T)
    • 方法可能修改原对象(因为是引用)。
    • 只有 *T 能保证正确的行为,所以 T 不算实现接口。

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{}

记住

  • 值接收者 → 更灵活,T*T 都能用。
  • 指针接收者 → 更严格,只有 *T 能赋值给接口。

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

相关文章

  • Golang学习笔记-接口和错误

    接口 Go接口定义了方法后,其它类型只要实现了这些方法就是实现了接口。Go语言中接口类型的独特之处在于它是满足隐式...

  • golang-接口

    Go语言规定,只要实现了接口里面的方法,就是该接口的实现类 定义一个接口 接口实现1 接口实现 2 main方法

  • go接口与反射

    go语言的interface是个很松散的概念,类型不必明确声明实现了接口,go语言通过内部维护一个实现此接口方法的...

  • 【Golang 基础】Go 语言的接口

    Go 语言中的接口   Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,没有数据字段。 只要某个类型...

  • Go与c++混合编程

    利用cgo实现go调用c/c++的接口

  • 28. 多态

    28. 多态 Go 通过[接口]来实现多态。我们已经讨论过,在 Go 语言中,我们是隐式地实现接口。一个类型如果定...

  • Golang的接口

    有意思的接口规则:自动实现 Golang也支持接口,但是它的接口规则很有意思: 一个类型不需要显示声明它要实现的接...

  • 32. Readers读取数据流

    go语言的 io 包指定了 io.Reader 接口。go语言标准库包含了这个接口的许多实现,包括文件、网络连接、...

  • Go语言之Interface(二)

    使用指针接收器和值接收器实现接口 实现多个接口 接口嵌套 在Go语言中没有继承的概念,但是通过组合可以实现继承的效...

  • Bean的命名规则-注解类

    Bean的命名规则,定义在BeanNameGenerator接口的实现类 1.通过注解扫描Bean的命名规则 实现...

网友评论

      本文标题:Go 接口的实现规则

      本文链接:https://www.haomeiwen.com/subject/dmoavjtx.html