C語言無法直接調用Go語言,因為二者的運行時環境和調用約定(ABI)不同。不過可以通過Cgo來實現C語言調用Go語言的函數。
以下是一個簡單的示例,展示了如何在C語言中調用Go語言函數:
首先,創建一個Go語言的源文件(例如,test.go):
package main
import "C"
//export hello
func hello() {
println("Hello from Go!")
}
func main() {
// main函數留空
}
然后,使用Go命令將其編譯成靜態庫文件:
go build -buildmode=c-archive -o test.a test.go
編譯后會生成一個C語言靜態庫文件(test.a)。
接下來,創建一個C語言的源文件(例如,main.c):
#include "test.h"
int main() {
hello(); // 調用Go函數
return 0;
}
這里,我們包含了之前生成的Go靜態庫文件的頭文件(test.h),并在main函數中調用了Go函數hello()。
最后,使用gcc編譯C語言源文件和Go靜態庫文件并鏈接它們:
gcc -o main main.c test.a
編譯成功后,運行生成的可執行文件(main),即可在控制臺看到 “Hello from Go!” 的輸出。
需要注意的是,Cgo是通過CGO_ENABLED環境變量開啟的。在編譯Go代碼時,如果沒有顯式設置該環境變量,可以通過添加"-x"參數來查看編譯命令的詳細輸出,確認CGO_ENABLED是否為1。如果不是,可以通過設置環境變量來開啟Cgo功能:
export CGO_ENABLED=1
另外,還可以使用swig工具來生成C語言接口文件,從而更方便地實現C和Go之間的互操作。