一个Go语言接口和多操作系统实现的简单例子
2023-09-14 08:56:49 时间
尽管不是纯的OO语言,Go仍然提供了interface接口的功能,能够非常轻松地实现抽象与具体实现的分离。另外,按照文件名格式匹配的模式,Go程序可以自动帮你加载符合当前操作系统的对应接口实现(分析了编译时的.a包,发现编译时候自动匹配,并只把符合当前操作系统的实现打包),不需要程序员在程序里面使用if-else或者switch去实现,还算比较省心。
下面的例子,首先定义一个接口 I。接口I只有两个public的方法:Get() 和 Put()。注意方法名首字母必须大写。具体代码如下:
//myservice.go package myinterface type I interface { Get() int Put(int) }
然后,按照Go的文件名匹配模式写不同操作系统的实现代码。具体格式如下:
接口文件名_操作系统名称_硬件平台.go。
例如,ztypes_openbsd_amd64.go
ztypes_openbsd_386.go
ztypes_windows_amd64.go
ztypes_windows_386.go
在我这个例子里面,只搞了3个操作系统的实现。
myservice.go ---接口文件;
myservice_windows.go ---windows 386实现
myservice_linux.go ---linux 386实现
myservice_darwin.go ---苹果系统 386实现
注意:3个接口实现类和接口类都在同一个包myinterface下。这里先展示其中一个实现类,剩下的接口实现的代码将在文章的末尾贴上。
//myservice_windows.go package myinterface type S struct { i int } func (p *S) Get() int { println("call windows version: Get") return p.i } func (p *S) Put(v int) { println("call windows version: Put") p.i = v } 注意到实现类的两个实现方法的调用对象都是指针*S,表示需要指针*S类型才能调用。这和后面的调用例子密切相关。
最后,写个测试例子,调用接口。
例子基本介绍完了,剩下的就是编译和运行例子的工作了。因为比较简单,就不多说了。上述引用的接口例子来源于QQ群里“星星”同学翻译的Go中文版书籍,再次对他的辛勤工作表示感谢。
剩余的其它接口实现代码:
//myservice_linux.go package myinterface type S struct { i int } func (p *S) Get() int { println("call linux version: Get") return p.i } func (p *S) Put(v int) { println("call linux version: Put") p.i = v }
//myservice_darwin.go package myinterface type S struct { i int } func (p *S) Get() int { println("call darwin version: Get") return p.i } func (p *S) Put(v int) { println("call darwin version: Put") p.i = v }
用 Go 从零实现日志包 - 第零篇 序言 设计一个日志包,需要考虑的基础功能有日志级别设置、标准输出和文件、输出格式配置、日志的时间戳、文件与打印行号、正文。高级功能有按级别分类输出、支持结构化日志、支持日志轮转。
Go 实现 AES 加密 CBC 模式|Go主题月 密码分组链接模式 CBC (Cipher Block Chaining),这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
【Golang】panic和recover底层逻辑实现|Go主题月 在每个goroutine也有一个指针指向_panic链表表头,然后每增加一个panic就会在链表头部加入一个_panic结构体。当所有的defer执行完后,_panic链表就会从尾部开始打印panic信息了,也就是说先发生的panic先打印信息。
下面的例子,首先定义一个接口 I。接口I只有两个public的方法:Get() 和 Put()。注意方法名首字母必须大写。具体代码如下:
//myservice.go package myinterface type I interface { Get() int Put(int) }
然后,按照Go的文件名匹配模式写不同操作系统的实现代码。具体格式如下:
接口文件名_操作系统名称_硬件平台.go。
例如,ztypes_openbsd_amd64.go
ztypes_openbsd_386.go
ztypes_windows_amd64.go
ztypes_windows_386.go
在我这个例子里面,只搞了3个操作系统的实现。
myservice.go ---接口文件;
myservice_windows.go ---windows 386实现
myservice_linux.go ---linux 386实现
myservice_darwin.go ---苹果系统 386实现
注意:3个接口实现类和接口类都在同一个包myinterface下。这里先展示其中一个实现类,剩下的接口实现的代码将在文章的末尾贴上。
//myservice_windows.go package myinterface type S struct { i int } func (p *S) Get() int { println("call windows version: Get") return p.i } func (p *S) Put(v int) { println("call windows version: Put") p.i = v } 注意到实现类的两个实现方法的调用对象都是指针*S,表示需要指针*S类型才能调用。这和后面的调用例子密切相关。
最后,写个测试例子,调用接口。
//test_interface.go
package main import "fmt" import "myinterface" //一个调用I接口的操作 func f(p myinterface.I) { fmt.Println(p.Get()) p.Put(1) } func main(){ //定义一个类型为数据结构S的变量。 var s myinterface.S //尽管S仅仅存在于各个接口实现类里,但由于各个实现类都实现了interface I, //而且实现的方法都是作用在结构S上,所以Go认定 s(s的地址)就是一个合法的I接口 f( s) fmt.Println(s.Get()) }例子基本介绍完了,剩下的就是编译和运行例子的工作了。因为比较简单,就不多说了。上述引用的接口例子来源于QQ群里“星星”同学翻译的Go中文版书籍,再次对他的辛勤工作表示感谢。
剩余的其它接口实现代码:
//myservice_linux.go package myinterface type S struct { i int } func (p *S) Get() int { println("call linux version: Get") return p.i } func (p *S) Put(v int) { println("call linux version: Put") p.i = v }
//myservice_darwin.go package myinterface type S struct { i int } func (p *S) Get() int { println("call darwin version: Get") return p.i } func (p *S) Put(v int) { println("call darwin version: Put") p.i = v }
用 Go 从零实现日志包 - 第零篇 序言 设计一个日志包,需要考虑的基础功能有日志级别设置、标准输出和文件、输出格式配置、日志的时间戳、文件与打印行号、正文。高级功能有按级别分类输出、支持结构化日志、支持日志轮转。
Go 实现 AES 加密 CBC 模式|Go主题月 密码分组链接模式 CBC (Cipher Block Chaining),这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。
【Golang】panic和recover底层逻辑实现|Go主题月 在每个goroutine也有一个指针指向_panic链表表头,然后每增加一个panic就会在链表头部加入一个_panic结构体。当所有的defer执行完后,_panic链表就会从尾部开始打印panic信息了,也就是说先发生的panic先打印信息。
相关文章
- 【愚公系列】2022年08月 Go教学课程 035-接口和继承和转换与空接口
- Go语言排序(借助sort.Interface接口)
- Go语言圣经–接口约定习题详解编程语言
- 使用Go语言来操作Oracle数据库(go语言oracle)
- Go语言网络爬虫下载器接口
- Go语言网络爬虫分析器接口
- Go语言接口内部实现
- 程序Linux上运行Go语言程序的指南(linux运行go)
- 轻松搞定Go语言连接MySQL(go连接mysql)
- SQL Server和Go组合,助力数据库计算更高效(sqlserver加go)
- 一步一步学习Go读取Oracle数据库(go读取oracle)
- Go语言快速安装Oracle数据库(go语言安装oracle)
- Go语句让Oracle数据库管理更方便(oracle go语句)