• 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类型")
    }
    
  • 相关阅读:
    diffstat命令
    v-if与v-show的区别
    常数时间插入、删除和获取随机元素
    diff命令
    C++ bitset的简单使用
    树的直径 | 简答的两道模板题
    Codeforces Round #544 (Div. 3)简单题解
    VIM 入门手册, (VS Code)
    PTA 天梯赛 L3-003 社交集群(并查集)
    L3-002 特殊堆栈 (双数组模拟栈)
  • 原文地址:https://www.cnblogs.com/louyefeng/p/11345198.html
Copyright © 2020-2023  润新知