Call C code from Golang

Prometheus, Grafana, Influxdbを使ってみてGo言語で実装されているということから、C言語とのインターフェイスを調べてみました。

環境)

$go version
go version go1.20.4 linux/amd64

参考)
https://ja.wikibooks.org/wiki/Go/cgo%E3%81%A7Go%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89C%E3%81%AE%E9%96%A2%E6%95%B0%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B
https://schima.hatenablog.com/entry/20100523/1274620423
https://karthikkaranth.me/blog/calling-c-code-from-go/

hello.c

callc.go

上記Go言語からC言語を呼び出していますが、とても簡単に記述できることにおどろかされました。(コメント内に記述)
ここでは言葉での説明よりコードを書いた方が理解しやすいため、いろんな呼び出し方を併記しました。

実行結果

$ go run callc.go
hello!
add: 3
abcdefg
0 / 3: 0 .. 0
1 / 3: 0 .. 1
2 / 3: 0 .. 2
3 / 3: 1 .. 0
4 / 3: 1 .. 1

今度は逆に、CからGoの関数を呼び出してみました。

gofunc.go

ビルド

go build -buildmode=c-archive gofunc.go
gcc -o callgo callgo.c gofunc.a -lpthread

gofunc.h(自動生成)

実行結果

$ ./callgo
1 + 2 = 3

Go言語のコードは、バイナリーコンパイル実行もできるため、C言語とのリンクも容易です。
いざというときのためのメモでした。

About

Categories: 未分類 タグ: