go专题-接口interface

2022/3/12 go

    🌙 go接口

    🌙 1.接口相关概念

    • go语言接口定义了一组方法集合,这些方法仅仅是被定义,并没有在接口中实现。
    • 接口interface是go语言的一种数据类型。
    • go语言中所有的类型都实现了空接口interface{},也就是说interface{}可以当做任意类型的数值。
    • 接口类型的未初始化变量的值为nil
    • 接口是一组抽象方法的集合,必须由其他非接口类型来实现,不能自我实现。
    • 定义方式:
    type InterfaceNamer interface {
        Method1(params) return_type
        Method2(params) return _type
    }
    
    1
    2
    3
    4

    通常接口名称以后缀-er来命名, 比如 ReaderWriterFormatter等。

    🌙 2.接口的实现

    • 在go语言中,如果接口的所有方法在某个类型方法集中被实现,则认为该类型实现了这个接口。
    • 类型不用显式声明实现了接口,只需要实现接口定义的所有方法,这样隐式实现解耦了实现接口的包和定义接口的包。
    • 同同一个接口可以被多个类型实现,一个类型也可以实现多个接口。
    package main
    
    import (
        "fmt"
    )
    
    type A struct {
        Books int
    }
    
    type Ber interface {
        f()
    }
    
    // A实现了接口Ber
    func (a A) f() {
        fmt.Println("A.f()", a.Books)
    }
    
    type I int
    
    // I实现了接口Ber
    func (i I) f() {
        fmt.Println("I.f()", i)
    }
    
    func main() {
        var a A = A{Books: 8}
        a.f() // 调用本身的方法
        
        // 接口类型可接受结构体A的值,因为接口体A实现了接口Ber
        var b Ber = A{Books: 88}
        b.f()
        
        // I是int类型引申出来的新类型
        var i I = 188
        i.f()
        
        // 接口类型可接受新类型I的值,因为新类型I也实现了接口Ber
        var bi Ber = I(288)
        bi.f()
    }
    
    // 输出:
    A.f()  9
    A.f()  99
    I.f()  199
    I.f()  299
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48

    如果接口在类型之后才定义,或二者处于不同的包中,但只要类型实现了接口的所有方法,这个接口就实现了此接口。

    接口定义的所有方法必须全部被事先,才能实现接口

    🌙 3.接口的嵌套

    接口的嵌入和结构体嵌入语法上差不多,直接写接口名称即可。

    下面的接口File包含了ReadWriteLock的所有方法,他还额外有一个Close()方法。

    type Lock interface {
        Lock()
        Unlock()
    }
    
    type ReadWrit interface {
        Read(b buffer) bool
        Write(b Buffer) bool
    }
    
    type File interface {
        ReadWrite
        Lock
        Close()
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    一个接口可以包含一个或多个其他的接口,但是在接口内不能嵌入结构体,也不能嵌入接口本身,否则编译会报错。

    // 1.Wrong 嵌入自己
    // compile error: invalid recursive type Bad
    type Bader interface {
        Bader
    }
    
    // 2.Wrong 循环嵌套接口其他接口
    // compiler error:invalid recursive type Bad2
    type Bader1 interface {
    	Bader2
    }
    // compiler error: invalid recursive type Bad1
    type Bader2 interface {
    	Bader1
    }
    
    // 3.Right 嵌入其他接口(不循环嵌套)
    type Gooder interface {
        f(a int) int
    }
    
    type Gooder1 interface {
        Gooder
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24