Go 接口

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类型")
}
上一篇:浅谈C# 多态


下一篇:Java中的静态类和非静态类