• [Go语言]从Docker源码学习Go——Interfaces


    Interface定义:

    type Namer interface {
        Method1(param_list) return_type
        Method2(param_list) return_type
        ...
    }

    注:

    1. interface中不能包含变量

    2. 一个类型不用显式去定义实现某个接口,只要包含所有interface中定义的方法,这个类型就默认实现了这个接口

    3. 多个类型可以实现相同的接口

    4. 一个类型实现接口的同时,还可以定义属于自己的方法

    5. 一个类型可以实现多个接口

    嵌套的interface

    type ReadWrite interface {
        Read(b Buffer) bool
        Write(b Buffer) bool
    }
    
    type Lock interface {
        Lock()
        Unlock()
    }
    
    type File interface {
        ReadWrite
        Lock
        Close()
    }

    这样File会包含ReadWrite和Lock中所有的方法

    判断interface类型

    v := varI.(T)
    //varI must be an interface variable.

    实例

    package lemon
    
    type Shaper interface {
        Area() float32
    }
    type Square struct {
        Side float32
    }
    
    func (sq *Square) Area() float32 {
        return sq.Side * sq.Side
    }
    
    //use in main func.
    func showInterfaceUsage() {
        sq1 := new(lemon.Square)
        sq1.Side = 5
        var areaIntf lemon.Shaper
        areaIntf = sq1
    
        if v, ok := areaIntf.(*lemon.Square); ok {
            fmt.Printf("The square has area: %f
    ", v.Area())
        }
    }

    注意:方法的定义中传的type为指针,判断时也要传指针。

        switch areaIntf.(type) {
        case *lemon.Square:
            fmt.Printf("The square area is %f
    ", areaIntf.Area())
        default:
            fmt.Printf("The default type")
        }

    也可以直接通过方法interface.(type)来获得接口的类型

    判断类型是否实现了接口

    ...待续

  • 相关阅读:
    KEIL5.25生成.bin文件步骤
    【转】树莓派网线直连笔记本电脑
    由编译器指定数组长度带来的一个问题
    【转】C/C++位域结构深入解析
    【转】大小端存储模式精解
    【转】树莓派入门之装系统
    【转】树莓派Raspberry Pi
    stm32的双向io口
    小记之while循环条件的操作位置
    【转】浮点数在计算机中存储方式
  • 原文地址:https://www.cnblogs.com/lemonbar/p/3936155.html
Copyright © 2020-2023  润新知