接口在golang中使用的特别多,在此加以简单的总结:
golang接口使用说明:
(1)空接口(没有任何方法的接口)可以看成是万能数据类型,可以接收任意类型的数据;如果是包含方法的接口,给该接口赋值,对应的值对象需要实现该接口的所有方法才可以。
(2)接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)
(3)接口中的所有方法都没有方法体,即都是没有实现的方法。
(4)在golang中,一个自定义类型需要将该接口对应的方法都实现,才能说该类型实现了该接口。
(5)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。
(6)一个自定义类型,可以同时实现多个接口。(如可以同时实现 A接口 B接口)
(7)若两个接口包含一样的方法,一个自定义类型实现了所有的方法,则该类型实现了这两个接口。接口的实现主要是通过方法来标记,而不是接口名称。
(8)接口类型默认是一个指针(引用类型),如果没有初始化就使用,就会输出nil。
(9)golang接口中,不能包含任意变量。
package main
import "fmt"
type USB interface {
working()
stop()
}
type USB1 interface {
working()
stop()
}
//定义Phone对象
type Phone struct {
}
//定义Cameron对象
type Cameron struct {
}
//定义Computer对象
type Computer struct {
}
//分别让两个对象实现USB的方法
func (p Phone) working() {
fmt.Println("手机开始工作。。。")
}
func (p Phone) stop() {
fmt.Println("手机停止工作")
}
func (c Cameron) working() {
fmt.Println("照相机开始工作。。。")
}
func (c Cameron) stop() {
fmt.Println("照相机停止工作")
}
func (c Computer) work(usb USB) { //具有相同接口的对象(struct)都可以作为函数参数(包含多态、高内聚低耦合的思想)
usb.working()
usb.stop()
}
//自定义类型的变量 都可以实现接口,不一定是struct
type MyInt int
func (i MyInt) working() {
fmt.Println("自定义类型的 working() 方法")
}
func (i MyInt) stop() {
fmt.Println("自定义类型的 stop() 方法")
}
func main() {
c := Computer{}
ca := Cameron{}
ph := Phone{}
c.work(ca) //由于Cameron实现了USB的接口,所以类型可以和USB进行匹配
c.work(ph) //由于phone实现了USB的接口,所以类型可以和USB进行匹配
fmt.Println("------------")
var usb USB
var myInt MyInt
usb = myInt //赋值给接口(包含方法),myInt需要实现该接口的所有方法。
usb.stop()
myInt.working()
}
/*
特别说明: golang中实现接口不需要显示来实现(Java中通过关键字,golang中接口对应的方法来实现)
如程序所示,对象通过 working()、stop()方法的实现,实现了接口USB、USB1.所以,接口与接口的方法相关,与接口名称无关。
如果要实现接口,就要实现接口里的所有方法。
*/