定义
接口是一个或多个方法签名的集合。
任何类型的方法集中只要拥有该接口对应的全部方法签名。 就表示它 “实现” 了该接口
举个例子来看一下:
//定义一个接口animal,其中包含say和move两个方法
type animal interface {
say()
move()
}
//分别定义两个结构体去实现animal接口,就需要实现接口的所有方法
type cat struct{}
type dog struct{}
func (*cat) move() {
fmt.Printf("cat is runing....\n")
}
func (*dog) move() {
fmt.Printf("dog is runing....\n")
}
func (*cat) say() {
fmt.Printf("cat say:喵喵喵\n")
}
func (*dog) say() {
fmt.Printf("cat say:汪汪汪\n")
}
func main() {
var xiaohua animal = &cat{}
var wangcai animal = &dog{}
wangcai.move()
wangcai.say()
xiaohua.move()
xiaohua.say()
}
如果没有实现所有方法,只实现了部分的方法会发生什么呢?
type animal interface {
say()
move()
}
type cat struct{}
func (*cat) say() {
fmt.Printf("cat say:喵喵喵\n")
}
func main() {
var xiaohua animal = &cat{}//这里会报错
xiaohua.say()
这时会报一个这样的错误:
cannot use &(cat literal) (value of type *cat) as animal value in variable declaration: missing method saycompiler
意思是一个数据类型如果没有实现接口的所有方法,那么就不能实现该接口。也就是不能这样写:var xiaohua animal = &cat{},就是说如果cat缺少animal的任意一个方法它就不能是animal。
所以要实现一个接口就必须实现该接口的所以方法
空接口
空接口就像是万金油,它可以作为任意类型。主要运用于空接口作为函数的参数,可以接受任意类型的数据;空接口作为map值储存任意类型的数据。这里我就不详细写了。
既然空接口可以作为任意类型的数据,那么要怎样判断它里面的数据是什么类型呢?
这里就可以使用类型断言
x.(类型名)//其中x为接口,返回两个数据第一个是值,第二个是bool判断成功还是失败。
var a interface{}
a = 100
v, ok := a.(int)
fmt.Printf("v=%#v\nok=%#v\n", v, ok)
也可以定义一个函数来判断空接口的数据类型
func justifyType(x interface{}) {
switch v := x.(type) {
case string:
fmt.Printf("x is a string,value is %v\n", v)
case int:
fmt.Printf("x is a int is %v\n", v)
case bool:
fmt.Printf("x is a bool is %v\n", v)
default:
fmt.Println("unsupport type!")
}
}
好了接口就说这么多,初学golang,如有不足,还请各位大佬多多指正。