Go 接口
在Go语言中,一个类只需要实现接口要求的所有函数,那这个类就实现了该接口。
语法:
type Namer interface{
method1(param_list) return_list
method2(param_list) return_list
...
}
实现接口
上面提到接口的实现非常简单,只要类实现接口中的所有函数就可以了,这种不需要显式的声明接口的方式也被称为非侵入式接口。
案例:
package main
import "fmt"
type Animal interface{
Run()
Eat(food string)
}
type Cat struct{
}
type Dog struct{
}
func (c Cat) Run(){
fmt.Println("猫在跑")
}
func (c Cat) Eat(food string){
fmt.Printf("猫在吃%v", food)
}
func (d Dog) Run(){
fmt.Println("狗在跑")
}
func (d Dog) Eat(food string){
fmt.Printf("狗在吃%v", food)
}
func main(){
cat := new(Cat)
cat.Eat("鱼")
cat.Run()
dog := Dog{}
dog.Eat("骨头")
dog.Run()
}
上方定义了一个Animal接口,该接口包含了两个函数(Run和Eat函数),然后定义了Cat和Dog结构体,并实现了这两个函数,这就是一个简单的实现接口的案例。
接口赋值给接口
首先定义两个接口
type Animal1 interface{
Run()
Eat()
}
type Animal2 interface{
Run()
}
func main(){
var a1 Ainmal1
var a2 Ainmal2
//a1 = a2 报错
a2 = a1
}
这里会如果将a2赋值给a1的话会报出Animal2 does not implement Animal 1(missing Eat method)
的错误,因为a2中并没有Eat方法,所以只有包含另一个接口所有函数的接口,才能赋值给另一个接口,就是小接口 = 大接口
接口类型查询
Go语言任何对象实例都实现了空接口interface{},空接口也可以接收任何值。
如:
var v1 interface{} = 1
var v2 interface{} = "yven"
var v3 interface{} = 1.234
var v4 interface{} = make(map[string] int)
var v5 interface{} = func() {}
空接口的应用在很多地方都有使用到
如:
func Println(a ...interface{})
因为可以接收任何值,但是不知道接收到的值是什么类型的,所以我们可以对接收到的类型进行判断,也就是类型查询,可以使用Comma-ok断言
,如:
var v1 interface{} = 123
if v, ok := v1.(int); ok {
fmt.Printf("%v 是int类型",v1)
}else {
fmt.Printf("%v 不是int类型",v1)
}
也可以使用接口.(type)来进行判断.不过要和switch一起使用才行,如:
var v2 interface{} = "yven"
switch v2.(type) {
case int:
fmt.Println("v2是int类型")
case float64:
fmt.Println("v2是float类型")
case map[string]int:
fmt.Println("v2是map类型")
}