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 语言接口
Go语言规格说明书 之 接口类型(Interface types)的更多相关文章
- Go语言规格说明书 之 通道类型(Channel types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 通道 发送语句(send) 和 接收操作符(receive)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 结构体类型(Struct types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 类型声明(Type declarations)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 类型(Types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 内建函数(Built-in functions)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 词汇元素(Lexical elements)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 变量声明(Variable/Short variable declarations)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言学习笔记(9)——接口类型
接口 Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口. /* 定义接口 */ type interface_name in ...
随机推荐
- SpringMVC接受JSON参数详解及常见错误总结我改
SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前 ...
- BAPC2017
Benelux Algorithm Programming Contest 2017 参考资料: https://blog.csdn.net/sizaif/article/details/798586 ...
- toogle
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- GO语言的进阶之路-面向对象编程
GO语言的进阶之路-面向对象编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当你看完这篇文章之时,我可以说你的Golang算是入门了,何为入门?就是你去看Docker 源码能看 ...
- .Net MVC个人笔记
关于转向的问题,目前知道的是Response.Redirect 和 location.href 我现在有两个controller,Home和Test <h2>this is Home< ...
- CM记录-升级Spark版本到2.x(转载)
①csd包:http://archive.cloudera.com/spark2/csd/ 下载SPARK2_ON_YARN-2.2.0.cloudera1.jar ②parcel包:http: ...
- DotNetBar滚动条的疑似BUG
1.重现过程,在winform窗体上拖一个VScrollBarAdv 2.Button里点击跟踪代码 3.Value居然是-5,,而不是0,这是直接赋值,不是手动拖的呀. 4.解决办法,将LargeC ...
- 8.SpringBoot 模板引擎 Thymeleaf
1.模板引擎原理 JSP.Velocity.Freemarker.Thymeleaf 都是模板引擎.SpringBoot推荐的Thymeleaf:语法更简单,功能更强大: Thymeleaf模板引擎 ...
- 四、移植 JZ2440 开发板
4.1 移植第一步 前面已经分析过了 .config 的过程,可以知道移植需要用到的文件: .config 文件 arch/arm/cpu 下的文件 board 目录 .config 文件是根据后面 ...
- leetCode- 472. Concatenated Words
因为每个组合的字符串,至少要有3个index. 起点,中间拼接点,结点.所以可以将字符串分解为子字符串,判断子字符串是否存在.但是,后面字符串的存在必须要在前面字符串已经存在基础上判断. class ...