接口与类型系统总览
2026/2/1大约 3 分钟
接口与类型系统
欢迎来到 Go 语言接口与类型系统章节!本章节将详细介绍 Go 的接口系统和鸭子类型。
章节导航
知识体系
接口概览
学习路线
快速预览
接口定义
// 定义接口
type Speaker interface {
Speak() string
}
// 实现(隐式)
type Dog struct {
Name string
}
func (d Dog) Speak() string {
return "Woof!"
}接口使用
// 使用接口
var s Speaker = Dog{Name: "Buddy"}
fmt.Println(s.Speak()) // Woof!
// 接口变量可以持有任何实现该接口的类型
s = Cat{Name: "Whiskers"}
fmt.Println(s.Speak()) // Meow!类型断言
// 类型断言
if dog, ok := s.(Dog); ok {
fmt.Println(dog.Name)
}
// 类型 switch
switch v := s.(type) {
case Dog:
fmt.Println("It's a dog")
case Cat:
fmt.Println("It's a cat")
}空接口
// 空接口可以持有任何类型
var any interface{}
any = 42
any = "hello"
any = Dog{Name: "Buddy"}
// 类型查询
if v, ok := any.(int); ok {
fmt.Println("Integer:", v)
}核心概念
鸭子类型
// "如果它走起像鸭子,叫起来像鸭子,那它就是鸭子"
// 不需要显式声明实现了接口
type Writer interface {
Write([]byte) (int, error)
}
// File 实现了 Writer
func (f *File) Write(data []byte) (int, error) {
// 写入文件
return len(data), nil
}
// Buffer 实现了 Writer
func (b *Buffer) Write(data []byte) (int, error) {
b.data = append(b.data, data...)
return len(data), nil
}
// 两者都可用于需要 Writer 的地方
func writeTo(w Writer, data []byte) {
w.Write(data)
}接口组合
// 基础接口
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
}
// ReadWriter 拥有 Read 和 Write 两个方法实践建议
学习建议
- 理解鸭子类型 - Go 接口是隐式实现的
- 小接口原则 - 接口应该小而专注
- 接受接口返回结构体 - 函数参数用接口,返回具体类型
- 避免空接口 - 优先使用具体接口
- 组合优于继承 - 使用接口组合实现代码复用
学习检查
完成本章节学习后,您应该能够:
下一步
让我们开始深入学习接口与类型系统的各个部分!