Go语言基础: 接口
现实生活中手机、相机、U盘都可以和电脑的USB接口建立链接,人们无须关注USB卡槽大小是否一样,因为所有的USB接口都要符合既定的规范。
简单介绍
Go中的接口是一种抽象数据类型,接口定义了对象的行为规范,只定义规范而不实现。接口中定义的规范由具体的对象来实现。
接口是一种数据类型,无须显式实现。只要一个变量含有接口类型中所有方法,那么这个变量就实现了接口。
type 接口名 interface {
方法名1(参数列表 1) 返回值列表1
方法名2(参数列表 2) 返回值列表2
}
接口名: 使用type将接口定义为自定义的类型名。Go语言的接口在命名时,一般会在单词后面添加er,比如有写操作的接口叫Writer。
代码演示
示例
package main
import "fmt"
// 定义接口
type Usber interface {
start() // 开机
stop() // 关机
}
// Phone 手机实现USB接口须实现USB接口中所有方法
type Phone struct {
Name string
}
func (p Phone) start() {
fmt.Println(p.Name, "start")
}
func (p Phone) stop() {
fmt.Println(p.Name, "stop")
}
func main() {
// 实例化
p := Phone{
Name: "iPhone",
}
var u Usber
u = p // 表示手机实现USB接口
u.start()
u.stop()
}
结构体必须实现了接口中定义的所有方法
同理可以实现其他结构体,并且使用这个接口
type Camera struct {
}
func (c Camera) start() {
fmt.Println("Camera start")
}
func (c Camera) stop() {
fmt.Println("Camera stop")
}
但是显然没办法通过接口调用接口中没有定义的方法
例如为Phone结构体增加一个run方法,Usber类型的变量是没办法调用这个方法的。
type Usber interface {
Start()
Stop()
}
type Computer struct {
}
func (c Computer) work(u Usber) {
u.Start()
u.Stop()
}
定义一个电脑结构体,定义一个work方法,参数是usb接口
func main() {
var computer = Computer{}
var phone = Phone{
Name: "iPhone",
}
var camera = Camera{}
computer.work(phone)
computer.work(camera)
}
此时phone可以作为work的参数,因为它实现了Usber中的接口。对camera同理。