当前位置: 首页 > news >正文

Go语言之接口与多态 -《Go语言实战指南》 - 指南

接口是 Go 语言实现 多态 的核心机制。本章将帮助你理解接口的设计哲学、动态行为,以及它如何让 Go 实现面向接口编程的能力。


一、什么是接口?

接口是一组方法签名的集合,任何类型只要实现了接口中声明的所有方法,就被视为实现了该接口不需要显式声明

接口定义示例:
type Speaker interface {    Speak()}

任何具有 Speak() 方法的类型,都会被认为实现了 Speaker 接口。


二、接口的使用

1. 定义接口与实现
type Animal interface {    Speak()} type Dog struct{}func (d Dog) Speak() {    fmt.Println("Woof!")} type Cat struct{}func (c Cat) Speak() {    fmt.Println("Meow!")}
2. 接口变量与多态调用
func MakeSound(a Animal) {    a.Speak()} func main() {    var d Dog    var c Cat     MakeSound(d) // Woof!    MakeSound(c) // Meow!}

这就是多态:一个接口类型变量 a,可以代表多个实现了该接口的类型(如 Dog、Cat)。


三、接口值的底层机制(简要)

接口类型的变量底层由两部分组成:

  • • 动态类型:接口实际指向的具体类型
  • • 动态值:接口存储的具体值

这让接口可以灵活绑定不同实现,但仍保持统一调用接口方法的行为。


四、接口组合(interface embedding)

接口之间也可以组合:

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}

任何类型只要实现了 Read() 和 Write() 方法,就实现了 ReadWriter 接口。


五、接口的动态行为与 nil 陷阱

var a Animal = nilfmt.Println(a == nil) // true var d *Dog = nila = dfmt.Println(a == nil) // false!

原因:接口变量 a 本身不为 nil,它的动态类型是 *Dog,只是动态值为 nil。

解决:使用类型断言判断实际是否为 nil。


六、接口与工厂模式

接口是 Go 中实现解耦的核心工具,适合用于构建灵活的“工厂”类模式:

type Shape interface {    Area() float64} type Circle struct {    Radius float64} func (c Circle) Area() float64 {    return 3.14 * c.Radius * c.Radius} func NewShape(name string) Shape {    switch name {    case "circle":        return Circle{Radius: 5}    default:        return nil    }}

七、小结

概念说明
接口方法集合的抽象,任何实现了接口方法的类型都符合接口
多态同一接口变量可绑定不同实现类型,统一调用方式
接口组合可通过嵌套组合多个接口
接口工厂模式常用于隐藏具体实现,返回接口类型以实现解耦
nil 陷阱接口变量底层包含“类型+值”,判断 nil 时需注意

http://www.hskmm.com/?act=detail&tid=26131

相关文章:

  • 地球科学概论
  • 2025多校冲刺CSP模拟赛4 总结
  • 多路归并、败者树、置换-选择排序、最佳归并树
  • 看vue文档记录(未整理)
  • Spring5笔记
  • 50天50个前端项目 - HTML/CSS和JavaScript实战合集
  • [BalticOI 2002] Tennis Club (Day1) 解题报告
  • 党徽
  • ZKEACMS:基于ASP.Net Core开发的开源免费内容管理系统
  • MySQL面试题汇总
  • 穷人的中国象棋打谱程序
  • 文件系统的层次结构
  • oracle 19c学习笔记2
  • 文件保护
  • 一些数数杂题
  • AI元人文:规则与人文的统一之路
  • 10.7
  • qmd 模拟赛的一道题
  • 四元数:从理论基础到实际应用的深度探索 - 教程
  • Day12
  • HoneyWell(霍尼韦尔)1450g扫码枪说明书
  • 课上动手东脑问题
  • 箭头函数的疑问
  • 文件共享
  • 【万字长文】让面试没有难撕的JS基础题
  • Java总览
  • PCoT: Persuasion-Augmented Chain of Thought for Detecting Fake News and Social Media Disinformation
  • 博客地址
  • 宏定义中,为什么使用:do{}while(0)这种模式是最安全的
  • 20251007J赛合订本