Golang中接口定义了对象的行为规范,只定义规范不实现。接口中定义的规范由具体的对象来实现。
每个接口由数个方法组成,接口的定义格式如下:
type 接口名 interface {
方法名1 (参数列表1) 返回值列表1
方法名2 (参数列表2) 返回值列表2
……
}
- 接口名:使用type将接口定义为自定义的类型名。Go语言的接口在命名时,一般会在单词后加er,eg:写操作的接口叫Writer,有字符串功能的接口叫Stringer等。
- demo
如果接口中有方法,必须要通过结构体或者通过自定类型实现这个接口
package main
import "fmt"
type Usber interface {
start()
stop()
}
type Phone struct {
Name string
}
type Camera struct {
Name string
}
func (p Phone) start() {
fmt.Println(p.Name, "启动")
}
func (p Phone) stop() {
fmt.Println(p.Name, "关机")
}
func (p Camera) start() {
fmt.Println(p.Name, "启动")
}
func (p Camera) stop() {
fmt.Println(p.Name, "关机")
}
func (p Camera) takePhoto() {
fmt.Println(p.Name, "在拍照")
}
func main() {
p := Phone {
Name : "Huawei",
}
p.start()
//Huawei 启动
var p1 Usber
p1 = p //手机实现了Usb接口
p1.stop()
//Huawei 关机
c := Camera {
Name : "Canon",
}
var c1 Usber = c //表示相机实现了Usb接口
c1.start()
//c1.takePhoto()//type Usber has no field or method takePhoto
c.takePhoto()
//Canon 在拍照
}
- demo2
package main
import "fmt"
type Usber interface {
start()
stop()
}
// 电脑
type Computer struct {
}
func (c Computer) work (usb Usber) {
usb.start()
usb.stop()
}
//手机
type Phone struct {
Name string
}
type Camera struct {
}
func (p Phone) start() {
fmt.Println(p.Name, "启动")
}
func (p Phone) stop(){
fmt.Println(p.Name, "关机")
}
func (p Camera) start() {
fmt.Println("相机启动")
}
func (p Camera) stop() {
fmt.Println("相机关机")
}
func main() {
var computer = Computer{}
var phone = Phone{
Name:"Xiaomi",
}
computer.work(phone)
//Xiaomi 启动
//Xiaomi 关机
var camera = Camera{}
computer.work(camera)
//相机启动
//相机关机
}
注意,当注释掉上面
Camera
的start
或stop
方法时,执行Computer.work(camera)
时就会报错,因为传入的camera没有实现usb接口的方法
有疑问加站长微信联系(非本文作者)