Go與其它語言進行互動

來源:互聯網
上載者:User

Go與其它語言進行互動

與 C 進行互動

工具 cgo 提供了對 FFI(外部函數介面)的支援,能夠使用 Go 代碼安全地調用 C 語言庫,你可以訪問 cgo 文檔首頁:http://golang.org/cmd/cgo。cgo 會替代 Go 編譯器來產生可以組合在同一個包中的 Go 和 C 代碼。在實際開發中一般使用 cgo 建立單獨的 C 程式碼封裝。

如果你想要在你的 Go 程式中使用 cgo,則必須在單獨的一行使用 import "C" 來匯入,一般來說你可能還需要 import "unsafe"

然後,你可以在 import "C" 之前使用注釋(單行或多行注釋均可)的形式匯入 C 語言庫(甚至有效 C 語言代碼),它們之間沒有空行,例如:

// #include <stdio.h>// #include <stdlib.h>import "C"

名稱 "C" 並不屬於標準庫的一部分,這隻是 cgo 整合的一個特殊名稱用於引用 C 的命名空間。在這個命名空間裡所包含的 C 類型都可以被使用,例如 C.uintC.long 等等,還有 libc 中的函數 C.random() 等也可以被調用。

當你想要使用某個類型作為 C 中函數的參數時,必須將其轉換為 C 中的類型,反之亦然,例如:

var i intC.uint(i)       // 從 Go 中的 int 轉換為 C 中的無符號 intint(C.random()) // 從 C 中 random() 函數返回的 long 轉換為 Go 中的 int

下面的 2 個 Go 函數 Random()Seed() 分別調用了 C 中的 C.random()C.srandom()

樣本 3.2 c1.go

package rand// #include <stdlib.h>import "C"func Random() int {    return int(C.random())}func Seed(i int) {    C.srandom(C.uint(i))}

C 當中並沒有明確的字串類型,如果你想要將一個 string 類型的變數從 Go 轉換到 C 時,可以使用 C.CString(s);同樣,可以使用 C.GoString(cs) 從 C 轉換到 Go 中的 string 類型。

Go 的記憶體管理機制無法管理通過 C 代碼分配的記憶體。

開發人員需要通過手動調用 C.free 來釋放變數的記憶體:

defer C.free(unsafe.Pointer(Cvariable))

這一行最好緊跟在使用 C 代碼建立某個變數之後,這樣就不會忘記釋放記憶體了。下面的代碼展示了如何使用 cgo 建立變數、使用並釋放其記憶體:

樣本 3.3 c2.go

package print// #include <stdio.h>// #include <stdlib.h>import "C"import "unsafe"func Print(s string) {    cs := C.CString(s)    defer C.free(unsafe.Pointer(cs))    C.fputs(cs, (*C.FILE)(C.stdout))}

構建 cgo 包

你可以在使用將會在第 9.5 節講到的 Makefile 檔案(因為我們使用了一個獨立的包),除了使用變數 GOFILES 之外,還需要使用變數 CGOFILES 來列出需要使用 cgo 編譯的檔案清單。例如,樣本 3.2 中的代碼就可以使用包含以下內容的 Makefile 檔案來編譯,你可以使用 gomake 或 make:

include $(GOROOT)/src/Make.incTARG=randCGOFILES=\c1.go\include $(GOROOT)/src/Make.pkg

與 C++ 進行互動

SWIG(簡化封裝器和介面產生器)支援在 Linux 系統下使用 Go 代碼調用 C 或者 C++ 代碼。這裡有一些使用 SWIG 的注意事項:

  • 編寫需要封裝的庫的 SWIG 介面。
  • SWIG 會產生 C 的存根函數。
  • 這些庫可以使用 cgo 來調用。
  • 相關的 Go 檔案也可以被自動產生。

這類介面支援方法重載、多重繼承以及使用 Go 代碼實現 C++ 的抽象類別。

目前使用 SWIG 存在的一個問題是它無法支援所有的 C++ 庫,比如說它就無法解析 TObject.h。

image
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.