一、定义在 Go 语言中接口Interface是一种抽象类型它定义了一组方法func的集合而不关心这些方法是如何实现的。任何类型只要实现了接口中定义的所有方法就自动实现了该接口不需要像 Java 一样使用implements关键字声明。接口实现了GO语言的著名设计思想——面向接口编程而不是面向实现编程例如手机充电器只关心有没有 Type-C 接口而不关心是什么品牌的手机。支付系统只关心是否能够完成支付而不关心底层是微信还是支付宝。在程序设计中也是如此type USB interface { Connect() }任何结构体只要实现了Connect()方法就属于USB类型。例如type Mouse struct{} func (m Mouse) Connect() { fmt.Println(鼠标连接成功) }Go 会自动认为Mouse 实现了 USB 接口这就是 Go 的隐式实现Implicit Implementation。二、 基础语法1. 定义接口接口使用interface关键字定义。type Animal interface { Speak() }接口中只能声明方法不能写属性。2. 实现接口定义 Dogtype Dog struct{}实现接口func (d Dog) Speak() { fmt.Println(汪汪) }定义 Cattype Cat struct{}实现接口func (c Cat) Speak() { fmt.Println(喵喵) }3. 使用接口func Say(a Animal) { a.Speak() } func main() { dog : Dog{} cat : Cat{} Say(dog) Say(cat) }输出汪汪 喵喵程序根本不关心传进来的是 Dog 还是 Cat。这就是多态。4. 空接口Go 中最特殊的接口interface{}Go1.18 后可以写成any空接口没有任何方法。因此任何类型都实现了空接口。例如var a interface{} a 10 a hello a true a Dog{}都合法。5. 类型断言由于空接口不知道里面存放什么类型需要类型断言。var a interface{} a 100 v : a.(int) fmt.Println(v)如果类型错误a hello v : a.(int)程序直接 panic。安全写法v, ok : a.(int) if ok { fmt.Println(v) } else { fmt.Println(不是int) }三、底层原理Go 接口虽然看起来只是一个抽象类型但在底层实际上由两个部分组成interface │ ├── type动态类型 └── data数据指针可以理解成interface │ ├── 保存对象类型 └── 保存对象地址例如var a Animal a Dog{}内存大致如下a │ ├── type → Dog └── data → Dog对象调用a.Speak()实际执行流程interface │ ▼ 获取真实类型(Dog) │ ▼ 查找Dog的方法表 │ ▼ 调用Speak()这种机制称为动态分派Dynamic Dispatch。空接口底层空接口底层只有type data因此任何对象 ↓ 都能存进去这也是为什么interface{}可以存放任何类型。四、与其他语言对比比项GoJavaC是否需要声明实现❌ 不需要✅ implements✅ 继承虚基类是否支持多继承接口可嵌套组合接口可多实现类多继承复杂度高是否支持默认方法❌ 不支持✅Java 8可通过虚函数实现实现方式隐式实现显式实现继承 虚函数多态实现接口 方法集接口/抽象类虚函数Virtual设计理念组合优于继承面向对象面向对象Go 接口的优势隐式实现无需显式声明实现关系代码更简洁。低耦合业务逻辑依赖接口而非具体实现便于扩展。组合优于继承通过多个小接口组合功能而不是复杂的类继承体系。标准库广泛使用如io.Reader、io.Writer、error、sort.Interface等都采用接口设计具有高度的复用性。易于测试可以轻松通过 Mock模拟对象替换真实实现方便单元测试。