• Go语言规格说明书 之 接口类型(Interface types)


    go version go1.11 windows/amd64

    本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 接口类型(Interface types)

    接口类型应该是从软件设计上考虑才接入的类型,它本身不实现任何功能,但会 声明 一些功能。

    在Go语言中,任何 实现 了接口类型中 声明 的功能的类型,都可以成为 实现了 某接口

    比如,声明一个 汽车接口,里面包含若干方法,任何实现了这个 汽车接口 的的类型 都可以被称为 汽车,不过,有些是 汽油柴油动力汽车,有些是电动汽车。

    而且,一个类型可以实现多个接口,只要这个类型的 方法集 包含 某个 接口类型 所声明的文件,就可以称 这个类型实现了这个接口。

    上面是阅读了官文后自己对 接口类型 和 其它类型、方法集 等概念的理解,下面是补充,涵盖怎么使用接口类型的的信息。

    接口类型 中声明的方法 即使 接口类型的 方法集——不只是普通类型有方法集,接口类型也有。

    可以用接口类型声明变量,未初始化的接口类型变量为 nil。

    接口类型变量 可以存储 任何方法集涵盖了接口类型方法集 的类型 的值。

    接口类型变量怎么初始化呢?new函数!下面是来自RUNOOB.COM的示例代码:

    package main
    
    import (
        "fmt"
    )
    
    type Phone interface {
        call()
    }
    
    type NokiaPhone struct {
    }
    
    func (nokiaPhone NokiaPhone) call() {
        fmt.Println("I am Nokia, I can call you!")
    }
    
    type IPhone struct {
    }
    
    func (iPhone IPhone) call() {
        fmt.Println("I am iPhone, I can call you!")
    }
    
    func main() {
        var phone Phone
    
        phone = new(NokiaPhone)
        phone.call()
    
        phone = new(IPhone)
        phone.call()
    
    }
    runoob_iface_eg.go

    接口类型 的方法集 的名称必须是 非空 且 唯一 的(a unique non-blank name)——和前文将的结构体类型不一样,结构体类型有空域。

    牢记:

    多个类型 可以 实现 一个接口;

    一个类型 可以 实现 多个接口。

    空接口:

    任何类型都实现了 空接口。

    空接口 不是 nil。

    interface{}

    最后,接口类型嵌套——在 接口类型 定义中,直接使用 另一个接口类型的名称,这样,另一个接口类型的方法就被 嵌套到 新的接口类型中了。

    注意,被嵌入接口类型 的方法集中的方法 和 新接口类型中定义的方法名称 不能冲突,保持 唯一性。

    注意,接口类型不能 以任何形式嵌入其自身。

    其实,接口类型在之前的一篇博文中介绍过,不过,那时是理解不深刻,写了这样单独的一篇博文,对接口类型了解的更清楚了。当然,还需要更多的运用、实践才行。

    官文示例及俺的解读:

    // A simple File interface
    interface {
    	Read(b Buffer) bool
    	Write(b Buffer) bool
    	Close()
    }
    
    // 需要查看 类型的方法定义 文档,下面的类型T实现了上面的接口
    func (p T) Read(b Buffer) bool { return … }
    func (p T) Write(b Buffer) bool { return … }
    func (p T) Close() { … }
    
    // type 类型定义语句
    // 和结构体一样,只有使用type语句给接口类型定义了一个标识符了,接口类型才可以很好地使用
    // 当然,不排除匿名接口类型的使用,一般为一次性的
    // 定义接口类型后,直接 声明 变量?
    type Locker interface {
    	Lock()
    	Unlock()
    }
    
    type ReadWriter interface {
    	Read(b Buffer) bool
    	Write(b Buffer) bool
    }
    
    // 嵌入类型
    type File interface {
    	ReadWriter  // same as adding the methods of ReadWriter
    	Locker      // same as adding the methods of Locker
    	Close()
    }
    
    // 嵌入的类型导致方法名称冲突
    type LockedFile interface {
    	Locker
    	File        // illegal: Lock, Unlock not unique
    	Lock()      // illegal: Lock not unique
    }
    
    // 不能嵌套自身——循环嵌套
    // illegal: Bad cannot embed itself
    type Bad interface {
    	Bad
    }
    
    // illegal: Bad1 cannot embed itself using Bad2
    type Bad1 interface {
    	Bad2
    }
    type Bad2 interface {
    	Bad1
    }

    参考链接:

    1.Go 语言接口

  • 相关阅读:
    IOS cocos2d笔记1
    [转] 函数调用的栈分配
    iOS 静态类库项目的建立与使用
    Brew 编译mod错误Error: L6265E: Non-RWPI Section libspace.o(.bss) cannot be assigned to PI Exec region ER_ZI
    [LeetCode]7、Reverse Integer
    [LeetCode]1、Two Sum
    java学习路线和知识图谱
    《Java编程思想》第十一章 持有对象
    《Java编程思想》第十章 内部类
    《Java编程思想》第十三章 字符串
  • 原文地址:https://www.cnblogs.com/luo630/p/9668176.html
Copyright © 2020-2023  润新知