一个Go语言接口和多操作系统实现的简单例子
2012-07-10 17:14
906 查看
尽管不是纯的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类型才能调用。这和后面的调用例子密切相关。
最后,写个测试例子,调用接口。
//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
}
下面的例子,首先定义一个接口 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语言的简单爬虫来爬取CSDN博文(一)
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
- 实现一个go语言的简单爬虫来爬取CSDN博文(一)
- Go语言实现简单的一个静态WEB服务器
- go 语言实现一个简单的 web 服务器
- 用go的goroutine和channel实现一个简单的“生产、消费”(带有超时控制)小例子
- Go语言实现的一个简单Web服务器
- 今天的问题:一个简单的例子,请帮我解开“接口实现Java‘隐藏实现细目’”的迷惑。
- go语言实现一个简单的http客户端抓取远程url的方法
- 实现一个go语言的简单爬虫来爬取CSDN博文(一)
- 位运算实现加法的一个简单例子
- C++多态是如何实现的——一个简单明晰的例子告诉你!
- 一个重叠io的例子 实现一个简单的服务器
- 一个简单的jQuery插件ajaxfileupload实现ajax上传文件例子
- 中级JavaScript例子, 如何实现一个简单实用的模板套用机制, GXTemplate , 第4章(估计要写9章)
- Go语言入门——从一个简单例子入门
- 一个简单的Spring实现的例子
- 在windows 下用C实现的一个多播的简单例子
- Go语言操作mysql数据库简单例子