博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言规格说明书 之 接口类型(Interface types)
阅读量:2240 次
发布时间:2019-05-09

本文共 2317 字,大约阅读时间需要 7 分钟。

go version go1.11 windows/amd64

 

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

 

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

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

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

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

 

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

 

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

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

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

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

package mainimport (    "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 interfaceinterface {	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 itselftype Bad interface {	Bad}// illegal: Bad1 cannot embed itself using Bad2type Bad1 interface {	Bad2}type Bad2 interface {	Bad1}

 

参考链接:

1.

 

转载于:https://www.cnblogs.com/luo630/p/9668176.html

你可能感兴趣的文章
Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
查看>>
Eclipse使用(十)—— 使用Eclipse创建简单的Maven Java项目
查看>>
Eclipse使用(十一)—— 使用Eclipse创建简单的Maven JavaWeb项目
查看>>
Intellij IDEA使用(十三)—— 在Intellij IDEA中配置Maven
查看>>
面试题 —— 关于main方法的十个面试题
查看>>
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
FastDFS集群架构配置搭建(转载)
查看>>
HTM+CSS实现立方体图片旋转展示效果
查看>>
FFmpeg 命令操作音视频
查看>>
问题:Opencv(3.1.0/3.4)找不到 /opencv2/gpu/gpu.hpp 问题
查看>>
目的:使用CUDA环境变量CUDA_VISIBLE_DEVICES来限定CUDA程序所能使用的GPU设备
查看>>
问题:Mysql中字段类型为text的值, java使用selectByExample查询为null
查看>>
程序员--学习之路--技巧
查看>>
解决问题之 MySQL慢查询日志设置
查看>>
contOS6 部署 lnmp、FTP、composer、ThinkPHP5、docker详细步骤
查看>>
TP5.1模板布局中遇到的坑,配置完不生效解决办法
查看>>
PHPstudy中遇到的坑No input file specified,以及传到linux环境下遇到的坑,模板文件不存在
查看>>
TP5.1事务操作和TP5事务回滚操作多表
查看>>