這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
swig開源項目(http://www.swig.org)為多種程式設計語言提供了相互訪問的介面產生工具,這裡面也包含了為go語言產生調用C、C++代碼的功能。Go語言內建的cgo工具已經支援對C代碼的調用,但對C++代碼的支援確實不行,所以Go1已經把swig的C++這部分功能作為附帶功能加入(參見Go原始碼\go\misc\swig)。這樣,C++這塊的資源也可以被Go語言使用了。
1、為Go語言產生調用C語言的介面:
根據swig的相關文檔指導( http://www.swig.org/Doc2.0/Go.html#Go ),用swig內建的例子做測試。以下的例子都是在ubuntu12.04下測試完成的。例子來源\swigwin-2.0.7\Examples\go\simple
swig -go example.i
gcc -c -fpic example.c
gcc -c -fpic example_wrap.c
gcc -shared example.o example_wrap.o -o example.so
go tool 8g example.go
go tool 8c example_gc.c
這裡會報錯,
example_gc.c:14 8c: No such file or directory: runtime.h
After reading golang-nuts thread:
原來是沒有設定3個環境變數: GOROOT、 GOARCH和 GOOS。這裡臨時在控制台設定:
export GOROOT=/usr/lib/go
export GOARCH=386
export GOOS=linux
go tool 8c -I ${GOROOT}/pkg/${GOOS}_${GOARCH} example_gc.c
go tool pack grc example.a example.8 example_gc.8
go tool 8g runme.go
go tool 8l -o runme runme.8
//為了運行runme,還需要export LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${pwd}:${LD_LIBRARY_PATH}
./runme
這樣應該能看到運行結果了
2、為go語言產生調用C++語言的介面:
例子來源\swigwin-2.0.7\Examples\go\class
swig -c++ -go example.i
g++ -g -c -fpic example.cxx example_wrap.cxx
g++ -shared example.o example_wrap.o -o example.so
go tool 8g example.go
export GOROOT=/usr/lib/go
export GOARCH=386
export GOOS=linux
go tool 8c -I ${GOROOT}/pkg/${GOOS}_${GOARCH} example_gc.c
go tool pack grc example.a example.8 example_gc.8
go tool 8g runme.go
go tool 8l -o runme runme.8
//為了運行runme,還需要export LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${pwd}:${LD_LIBRARY_PATH}
./runme
最後,潑點冷水。調用C或者C++本地代碼,確實能滿足效能要求比較高的需求。但要記住,它是一把雙刃劍。它會讓你的解決方案更加複雜,需要花費更多的時間和精力去開發和維護。要不要使用它,只能靠你自己去衡量。