一、接口
1、 interface类型可以定义一-组方法,但是这些不需要实现。并且interface不能包含任何变量。到某个自定义类型(比如结构体Phone)要使用的时候,在根据具体情况把这些方法写出来
package main
import "fmt"
type Usb interface {
Start()
Stop()
}
type Phone struct {
}
type Camera struct {
}
type Computer struct {
}
func (p Phone) Start() {
fmt.Println("手机启动")
}
func (p Phone) Stop() {
fmt.Println("手机关闭")
}
func (c Camera) Start() {
fmt.Println("相机启动")
}
func (c Camera) Stop() {
fmt.Println("相机关闭")
}
func (com Computer) Working(usb Usb) {
usb.Start()
usb.Stop()
}
func main() {
phone := Phone{}
camera := Camera{}
computer := Computer{}
computer.Working(phone)
computer.Working(camera)
}
二、注意事项
1、接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)
package main
import (
"fmt"
)
type E interface {
Say()
}
type F struct {
Name string
}
func (b *F) Say() {
fmt.Println("我实现了这个方法")
}
func main() {
var b F
var a E = &b
a.Say()
}
2、接口中所有的方法都没有方法体.即都是没有实现的方法。
3、在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。
4、只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型
package main
import "fmt"
type A interface {
Say()
}
type B int
func (b B) Say() {
fmt.Println("b=",b)
}
func main() {
var i B = 10
var a A = i
a.Say()
}
5、一个自定义类型可以实现多个接口
package main
import "fmt"
type A interface {
Say()
}
type B interface {
Hello()
}
type C struct {
}
func (c *C) Say() {
fmt.Println("A接口被实现")
}
func (c *C) Hello() {
fmt.Println("B接口被实现")
}
func main() {
c := C{}
c.Say()
c.Hello()
}
6、-一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现。
package main
import "fmt"
type A interface {
Say()
}
type B interface {
Hello()
}
type D interface {
A
B
Hei()
}
type C struct {
}
func (c *C) Say() {
fmt.Println("A接口被实现")
}
func (c *C) Hello() {
fmt.Println("B接口被实现")
}
func (c *C) Hei() {
fmt.Println("D接口被实现")
}
func main() {
c := C{}
var d D = &c
d.Hello()
d.Say()
d.Hei()
}
7、interface类型默认是一个指针(引用类型,如果没有对interface初始化就使用那么会输出nil
8、空接口interface{}没有任何方法,所以所有类型都实现了空接口