C? Go? Cgo!
C? Go? Cgo! #
C? Go? Cgo! By Andrew Gerrand
はじめに #
cgoを使うことでGoパッケージを通してCコードを呼び出すことができます。ある特徴を持って書かれたGoのソースファイルが与えられると、cgoは単一のGoパッケージにまとめることが可能なGoとCのファイルを出力します。
例として、ここにCの関数 random と srandom をラップした2つの関数 - Random と Seed - を提供するGoパッケージがあります。
package rand
/*
#include <stdlib.h>
*/
import "C"
func Random() int {
return int(C.random())
}
func Seed(i int) {
C.srandom(C.uint(i))
}
ここで何が起きているか見ていきましょう、importの文から見ていきます。
rand パッケージは "C" をインポートしていますが、Goのライブラリにはそのようなパッケージがないことに気づくでしょう。 C は"疑似パッケージ"で、Cの名前空間への参照としてcgoにより解釈される特別な名前です。
rand パッケージは C パッケージに対する4つの参照を含んでいます: C.random と C.srandom の呼び出しと、 変換 C.uint(i) 、そして import 文です。
Random 関数はC標準ライブラリの random 関数を呼び出し、その結果を返しています。C内で、random はcgoにおける C.long 型である long 型の値を返しています。それはこのパッケージ外部のGoコードで使われる前に、通常のGoの型変換によってGoの型に変換しなければなりません: