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同理。