閱讀488 返回首頁    go 技術社區[雲棲]


一個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

  上一篇:go Struts.xml中Action的method與路徑的三種匹配方法
  下一篇:go 《洛克菲勒留給兒子的38封信》 第三封:天堂與地獄比鄰