接口(Interface)
interface
是 Go 语言中定义行为的一种方式,表示一个或多个方法的集合。接口类型是一组方法的定义,任何实现了这些方法的类型都自动满足该接口。Go 的接口提供了灵活的多态性。
接口可以进行的操作
- 定义接口:使用
type
关键字定义接口类型,接口中包含方法声明。 - 实现接口:一个类型只要实现了接口中的所有方法,就自动实现了该接口,不需要显式声明。
- 接口类型的变量:可以用接口类型的变量来存储实现了该接口的对象。
- 类型断言:通过类型断言来判断接口值的具体类型。
- 空接口:
interface{}
是一种特殊的接口类型,可以表示任何类型。
示例代码
// 定义一个接口
type Speaker interface {
Speak() string
}
// 定义一个类型并实现接口方法
type Dog struct{}
func (d Dog) Speak() string {
return "Woof!"
}
type Cat struct{}
func (c Cat) Speak() string {
return "Meow!"
}
// 使用接口类型的变量
var s Speaker
s = Dog{} // Dog 实现了 Speaker 接口
fmt.Println(s.Speak()) // 输出 "Woof!"
s = Cat{} // Cat 实现了 Speaker 接口
fmt.Println(s.Speak()) // 输出 "Meow!"
// 类型断言
if dog, ok := s.(Dog); ok {
fmt.Println("This is a Dog:", dog.Speak())
} else {
fmt.Println("This is not a Dog")
}
// 空接口
var any interface{}
any = "hello"
fmt.Println(any) // 输出 "hello"
any = 42
fmt.Println(any) // 输出 42
特别注意
- 隐式实现:Go 语言中接口的实现是隐式的,只要类型实现了接口中的所有方法,就自动实现了该接口。
- 接口变量的零值:接口变量的零值是
nil
。如果一个接口变量没有具体的值,那么对其方法的调用会导致运行时错误。 - 空接口:
interface{}
可以表示任何类型,因此它经常用在需要存储任意类型值的场景中,例如fmt.Println()
。
总结
- 接口是定义行为的一种方式,任何实现了接口方法的类型都自动满足该接口。
- 通过接口变量,可以实现不同类型的多态行为,使用类型断言可以获取接口的具体类型。
- 空接口是 Go 语言中的万能类型,用于存储任意类型的值。