本文最初发表在我的个人博客,查看原文,获得更好的阅读体验
接口是一组方法的集合,接口类型的方法集是其接口。在Go中,接口的实现无需显示指明,只需要实现类型实现了一个接口的所有方法,就表示该类型实现了该接口,这种实现方式也称为隐式实现。隐式接口实现解耦了接口的定义,这样,可以在任何包中实现一个接口,同时,也使得接口的定义更加明确。
一 接口
1.1 接口声明
接口的声明需要使用interface
关键字:
type 接口名称 interface
例如,我们可以定义一个USB接口:
type Usb interface {
Read(s string)
Write(s string)
}
接口的零值为
nil
1.2 接口类型及实现
接口类型的变量可以保存任何实现了这些方法的值。接口中的每个方法都必须有一个唯一的非空名称。
package main
import "fmt"
func main() {
// var device Usb
c := Computer{
"电脑"}
m := MobilePhone{
"手机"}
content := "Golang is an interesting language."
Insert(c, content)
Insert(m, content)
var player Player
player = &m
player.Play("Country Road")
}
type Usb interface {
Read(s string)
Write(s string)
// _(s string) 编译错误:methods must have a unique non-blank name
}
// 接口实现类型1
type Computer struct {
Name string
}
// 接口实现类型2
type MobilePhone struct {
Name string
}
func (c Computer) Read(s string) {
fmt.Printf("%v读取了%v个字符:%v。\n", c.Name, len(s), s)
}
func (c Computer) Write(s string) {
fmt.Printf("%v写入了%v个字符:%v。\n", c.Name, len(s), s)
}
func (m MobilePhone) Read(s string) {
fmt.Printf("%v读取了%v个字符:%v。\n", m.Name, len(s), s)
}
func (m MobilePhone) Write(s string) {
fmt.Printf("%v写入了%v个字符:%v。\n", m.Name, len(s), s)
}
// 接口类型的参数
func Insert(device Usb, content string) {
fmt.Printf("\n(设备类型:%T)\n", device)
device.Read(content)
device.Write(content)
}
type Player interface {
Play(s string)
}
func (m MobilePhone) Play(s string) {
fmt.Printf("%v开始播放歌曲:<<%v>>。\n", m.Name, s)
}
另外,类型可以实现多个接口:
type Player interface {
Play(s string)