在Golang中使用C語言代碼執行個體

來源:互聯網
上載者:User

標籤:

轉自:http://www.jb51.net/article/56720.htm

cgo 使得在 Golang 中可以使用 C 代碼。

Hello World

為了有一個較為直觀的瞭解,我們來看一個簡單的例子,建立檔案 main.go:

package main/*#include <stdio.h>void sayHi() {    printf("Hi");}*/import "C" func main() {    C.sayHi()}

執行程式:

go run main.go

程式執行並輸出 hi(更多的範例可以見 $GOROOT/misc/cgo)。

Windows 下的準備工作

如果想要在 Windows 上使用 cgo,那麼需要安裝 gcc 編譯器,這裡我使用 mingw-w64。

設定編譯和連結標誌

我們使用 import “C” 匯入的是一個偽包(pseudo-package),我們通過其來使用 C 代碼。在 import “C” 之前,緊跟著 import “C” 的注釋可以包括:

1.編譯器和連結器標誌
2.C 代碼

我們可以通過 #cgo 指令來設定編譯器和連結器標誌,例如:

// #cgo CFLAGS: -DPNG_DEBUG=1// #cgo amd64 386 CFLAGS: -DX86=1// #cgo LDFLAGS: -lpng// #include <png.h>import "C"

附帶提及一點的是,這些指令中可以包含構建約束(build constraint),詳細內容見:http://golang.org/pkg/go/build/#hdr-Build_Constraints。

常用的 #cgo 指令有:

1.CPPFLAGS、CFLAGS 指令被用於編譯當前包中的 C 檔案(任何的 .c、.s、.S 檔案)
2.CPPFLAGS、CXXFLAGS 指令被用於編譯當前包中的 C++ 檔案(任何的 .cpp、.cc、.cxx 檔案)
3.LDFLAGS 指令用於指定連結器標誌
4.pkg-config 指令用於通過 pkg-config 工具擷取編譯器和連結器標誌(例如:#cgo pkg-config: png cairo)

Golang 引用 C

結構體上需要注意的點:

1.C 結構體的網域名稱稱如果為 Golang 的關鍵字時,訪問時需要在網域名稱稱前面加上 _。比如說,C 中有一個結構體變數 x,此變數對應的結構體中有一個域 type,那麼在 Golang 中需要通過 x._type 來訪問 type 域
2.結構體的位域、非對齊資料等無法在 Golang 中表示時會被忽略
3.Golang 結構體中不能使用 C 類型的域

標準的 C 數實值型別對應:

1.C.char
2.C.schar(signed char)
3.C.uchar(unsigned char)
4.C.short
5.C.ushort(unsigned short)
6.C.int
7.C.uint(unsigned int)
8.C.long
9.C.ulong(unsigned long)
10.C.longlong(long long)
11.C.ulonglong(unsigned long long)
12.C.float
13.C.double

任何的 C 函數(包括 void 函數)都可以返回一個傳回值和 C 的 errno 變數(作為錯誤):

n, err := C.sqrt(-1)_, err := C.voidFunc()

直接調用 C 函數指標目前還無法支援。

有一些特殊的函數可以用於 C 類型和 Golang 類型之間轉換(通過資料拷貝的方式),偽定義如下:

// Golang 的字串轉為 C 字串// C 的字串是使用 malloc 分配的,因此,此函數的調用者// 需要調用 C.free 來釋放記憶體func C.CString(string) *C.char // 轉換 C 字串到 Golang 字串func C.GoString(*C.char) string // 轉換一定長度的 C 字串到 Golang 字串func C.GoStringN(*C.char, C.int) string // 轉換一塊 C 記憶體地區到 Golang 的位元組數組中去func C.GoBytes(unsafe.Pointer, C.int) []byte

其他需要注意的點:

1.C 語言中的 void* 對應 unsafe.Pointer
2.C 語言中的結構、聯合、枚舉類型(而非變數),在 Golang 中需要加上 struct_、union_、enum_ 首碼訪問。由於 Golang 中沒有聯合這種資料類型,因此 C 的聯合在 Golang 中被表示為位元組數組
3.和 C 語言等價的那些類型是不可以匯出的

在Golang中使用C語言代碼執行個體

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.