簡介:
在go1.8出現以前,一直覺得go語言不能像C/C++一樣可以使用動態庫的方式動態修改服務。每次升級操作都不得不重新編譯整個工程,重新部署服務。這對於很多比較重型的服務來說是一個很致命的弱點。
目前在go1.8隻在linux和Darwin系統下支援plugin.從go1.8源碼中plugin包中plugin.go檔案開頭中有對應的說明。在go1.8中plugin包在作業系統的支援並不十分完善,即使在linux系統下也需要特定gcc的編譯器及連接器的支援。後續版本應該會有做相應的改進。
使用
建立一個提供方法的檔案print.go
package main import ( "fmt")func PrintTest(strInput string) { fmt.Println("string in print.so is:", strInput)}
編譯go動態庫命令:
go build -buildmode=plugin
指定檔案編譯go動態庫命令
go build -buildmode=plugin -o print.so print.go
go 動態庫方法的使用(main.go):
package mainimport ( "plugin")func main() { //開啟動態庫 pdll, err := plugin.Open("print.so") if err != nil { //... return } //擷取動態庫方法 funcPrint, err := pdll.Lookup("PrintTest") if err != nil { //... return } //動態庫方法調用 funcPrint.(func(string))("hello go plugin") return}
go1.8中plugin包只提供Open和Lookup方法,對應開啟動態庫和擷取動態庫中的方法。注意擷取到的動態動態庫方法其實是一個interface{}類型,需要將其進行轉換後才可以使用。