博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个Go语言接口和多操作系统实现的简单例子
阅读量:6251 次
发布时间:2019-06-22

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

hot3.png

尽管不是纯的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 

 }

转载于:https://my.oschina.net/qinhui99/blog/65132

你可能感兴趣的文章
vue导航栏跳转路由
查看>>
OC - 缓存 - NSCache - 介绍
查看>>
Jenkins+GitHub+fir_cli 一行命令从源码到fir im
查看>>
【转】TCP三次握手和四次挥手全过程及为什么要三次握手解答
查看>>
[系统资源攻略]IO第一篇-磁盘IO,内核IO概念
查看>>
在 CentOS 7 上设置 grub2
查看>>
[BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
查看>>
[BZOJ 2140]稳定婚姻(强连通分量)
查看>>
人工智能工程师学习路线
查看>>
I don't like to be an theorist
查看>>
「docker实战篇」python的docker- 抖音视频抓取(上)(24)
查看>>
powerdesigner 画出 C++ UML 增加const,static,virtual属性
查看>>
12月10日站立会议
查看>>
Nginx入门(2)反向代理和负载均衡
查看>>
MySQL库表状态查询
查看>>
【鲁班学院】干货分享!《面试必备之Mysql索引底层原理分析》
查看>>
快捷键
查看>>
第十一周项目0-是春哥啊
查看>>
poi做一个简单的EXCAL
查看>>
几种查询emacs帮助的办法
查看>>