488
技術社區[雲棲]
一個Go語言接口和多操作係統實現的簡單例子
盡管不是純的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
}
最後更新:2017-04-02 16:47:50