CGO編程基礎快速入門

帶你瞭解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編程基礎的資料請關註WalkonNet其它相關文章!

推薦閱讀: