实现接口的所有方法就隐式的实现了接口;

    在Go中,接口是一组方法签名。 当类型为接口中的所有方法提供定义时,就说实现了该接口。

    接口特征

    • 接口只有方法声明,没有实现
    • 接口可以嵌入到其他接口,或者结构体中
    • 将对象赋值给接口时,会发生拷贝,而接口内部存储的是指这个复制品的指针,既无法修改复制品的状态,也无法获得指针。
    • 只有当接口存储的类型和对象都为nil时,接口才等于nil
    • 接口调用不会做receiver的自动转换
    • 接口同样支持匿名字段方法
    • 接口可实现类似面向对象中的多态
    • 空接口:如果一个接口里面没有定义任何方法,那么它就是空接口,任意结构体都隐式地实现了空接口。
    • 接口变量只包含两个指针字段,那么它的内存占用应该是2个指针字节长度
    • 可以把拥有超集的接口转化为子集的接口。

    Go语言里面有4种不同类型的函数:

    • 顶级函数
    • 值接受者函数
    • 指针接受者函数
    • 函数字面量

    5种不同类型的调用:

    • 直接调用顶级函数
    • 直接调用值接受者函数
    • 直接调用指针接受者函数
    • 接口上方法的间接调用
    • 函数值的间接调用

    它们混合在一起,构成了功能和调用类型的10种可能的组合:

    • 直接调用顶级函数/
    • 直接调用带有值接收器的方法/
    • 直接调用带有指针接收器的方法/
    • 接口上方法的间接调用/包含值方法的值/
    • 接口上的方法的间接调用/包含带有值方法的指针
    • 接口上的方法的间接调用/包含带有指针方法的指针
    • 间接调用func值/设置为顶级func
    • 间接调用func值/设置为value方法
    • 间接调用func值/设置为指针方法
    • 间接调用func值/设置为字面量func

    断言

    • 空接口.(具体类型) ```go var e interface {}

    f,_ := os.Open(“a.txt”)

    e = f

    r, ok := e.(“os.File”)

    ok 为true ok 为false时,r被赋值为动态类型的零值

    1. - 非空接口.(具体类型)
    2. ```go
    3. var rw io.ReadWriter
    4. r,ok := rw.(*os.File)
    5. ok 为 true
    6. r被赋值为rw的动态值
    • 空接口.(非空接口)
    1. var e interface {}
    2. f, _ := os.Open("a.txt")
    3. e = f
    4. rw,ok := e.(io.ReadWriter)
    5. ok true
    • 非空接口.(非空接口)
    1. var w io.Writer
    2. f,_ := os.Open("a.txt")
    3. w = f
    4. rw, ok := w.(io.ReaderWriter)
    5. ok true