Go 接口

Posted louyefeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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类型")

以上是关于Go 接口的主要内容,如果未能解决你的问题,请参考以下文章

gRPC服务开发和接口测试初探「Go」

Go语言开发(十七)Go语言database/sql接口

Go interface

Go接口

Go基础系列:Go接口

6.2 如何理解Go语言中的接口