首頁 > 軟體

CGO程式設計基礎快速入門

2022-12-23 14:00:36

帶你瞭解CGO程式設計

大學時最開始學的語言莫過於C/C++,C/C++經過幾十年的發展,已經積累了龐大的軟體資產,它們很多久經考驗而且效能已經足夠優化。Go語言則是站在巨人的肩膀之上而誕生,go也自帶一個CGO的工具來支援C語言函數的呼叫,同時我們可以用GO語言匯出C動態庫介面給其他語言使用

快速入門

我們先通過一個簡單的CGO程式來了解Go中的C

package main
import "C"
func main() {
	println("hello cgo")
}

程式碼通過 import "C" 語句啟用CGO特性,同時包含C 語言的 標頭檔案。然後通過CGO包的 C.CString 函 數將Go語言字串轉為C語言字串,最後呼叫CGO包的 C.puts 函數向標準輸出視窗列印轉換後的C字串。

相比“Hello, World 的革 命”一節中的CGO程式最大的不同是: 我們沒有在程式退出前釋放 C.CString 建立的C語言字串; 還有我們改用 puts 函數直接向標準輸出列印,之前是採用fputs向標準輸出列印。

沒有釋放使用 C.CString 建立的C語言字串會導致記憶體漏失。但是對於這個小程式來說,這樣是沒有問題的,因為程式 退出後作業系統會自動回收程式的所有資源。

CGO基礎

要使用CGO特性,需要安裝C/C++構建工具鏈,在macOS和 Linux下是要安裝GCC,在windows下是需要安裝MinGW工具。同時需要保證環境變數 CGO_ENABLED 被設定為1,這表示 CGO是被啟用的狀態。在本地構建時 CGO_ENABLED 預設是啟 用的,當交叉構建時CGO預設是禁止的。比如要交叉構建 ARM環境執行的Go程式,需要手工設定好C/C++交叉構建的 工具鏈,同時開啟 CGO_ENABLED 環境變數。然後通過 import "C" 語句啟用CGO特性。

import "C" 語句

如果在GO程式碼中出現 import "C" 則該go檔案使用到了CGO特性,緊跟在這行語句前面的註釋是一種特殊語法,裡面包含正常的C語言程式碼

package main
//#include <stdio.h>
import "C"
/*
#include <stdio.h>
void hello(){
	printf("hello world!!! n");
}
*/
func main() {
	C.hello()
}

這個例子展示了cgo的基本使用方法。開頭的註釋中寫了要調 用的C函數和相關的標頭檔案,標頭檔案被include之後裡面的所有 的C語言元素都會被加入到”C”這個虛擬的包中。需要注意的 是,import "C"匯入語句需要單獨一行,不能與其他包一同 import。向C函數傳遞引數也很簡單,就直接轉化成對應C語言 型別傳遞就可以。

cgo將當前包參照的C語言符號都放到了虛擬的C包中,同時通過虛擬的C包匯入的C語言符號並不需要是大寫字母開頭,它們不受Go語言的匯出規則約束。 cgo將當前包參照的C語言符號都放到了虛擬的C包中,同時當 前包依賴的其它Go語言套件內部可能也通過cgo引入了相似的虛擬C包,但是不同的Go語言套件引入的虛擬的C包之間的型別是不能通用的。這個約束對於要自己構造一些cgo輔助函數時有可能會造成一點的影響。

以上就是CGO程式設計基礎快速入門的詳細內容,更多關於CGO程式設計基礎的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com