1. 章节简介
- 接口(interface)定义了一组方法的集合。
- 在 Go 中,接口的实现是隐式的:只要类型实现了接口的方法,就实现了该接口。
- 接口常用于 多态、解耦、抽象编程。
2. 知识点讲解
(1) 接口定义
type Speaker interface {
Speak() string
}
(2) 接口隐式实现
- 不需要关键字
implements,只要方法匹配即可。
type Dog struct{}
func (d Dog) Speak() string { return "Woof!" }
type Cat struct{}
func (c Cat) Speak() string { return "Meow!" }
(3) 接口类型变量
var s Speaker
s = Dog{}
fmt.Println(s.Speak())
(4) 多态
animals := []Speaker{Dog{}, Cat{}}
for _, a := range animals {
fmt.Println(a.Speak()) // 输出 Woof! / Meow!
}
(5) 空接口
-
interface{} 表示可以接受任意类型(类似 Java 的 Object)。
var any interface{}
any = 42
any = "hello"
(6) 类型断言(type assertion)
val, ok := any.(string)
if ok {
fmt.Println("It's a string:", val)
}
3. 代码示例
package main
import "fmt"
type Speaker interface {
Speak() string
}
type Dog struct{}
func (Dog) Speak() string { return "Woof!" }
type Cat struct{}
func (Cat) Speak() string { return "Meow!" }
func main() {
// 接口多态
animals := []Speaker{Dog{}, Cat{}}
for _, a := range animals {
fmt.Println(a.Speak())
}
// 空接口 + 类型断言
var x interface{} = "Hello"
if str, ok := x.(string); ok {
fmt.Println("x is string:", str)
}
}
4. 练习任务
- 定义一个
Shape 接口,包含 Area() 方法。
- 为
Circle 和 Rectangle 实现 Area()。
- 使用接口变量计算不同图形的面积。
- 尝试用空接口存储不同类型数据,并用类型断言取出。
5. 小结
- 接口是方法集合,Go 中实现是隐式的。
- 使用接口可以实现多态。
- 空接口可表示任意类型。
- 类型断言用于获取具体类型。