Cgo

C? Go? Cgo!

Cgo

C? Go? Cgo! #

C? Go? Cgo! By Andrew Gerrand

はじめに #

cgoを使うことでGoパッケージを通してCコードを呼び出すことができます。ある特徴を持って書かれたGoのソースファイルが与えられると、cgoは単一のGoパッケージにまとめることが可能なGoとCのファイルを出力します。

例として、ここにCの関数 randomsrandom をラップした2つの関数 - RandomSeed - を提供する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.randomC.srandom の呼び出しと、 変換 C.uint(i) 、そして import 文です。

Random 関数はC標準ライブラリの random 関数を呼び出し、その結果を返しています。C内で、random はcgoにおける C.long 型である long 型の値を返しています。それはこのパッケージ外部のGoコードで使われる前に、通常のGoの型変換によってGoの型に変換しなければなりません:

...