最近はもっぱらGo言語である。CGOでやっぱりはまる。
Go言語、なかなかに良い。まずはおなじみのバイディングを行ってみた。Go言語にはCGO(シーゴー)というバインディングフレームワークがある。これがなかなか強力。
簡単なライブラリをバインドしてみるわけだが、
package main /* #cgo LDFLAGS: -lmath #include <math.h> static double go_sin(double x) { return sin(x); } */ import "C" import "fmt" func main { fmt.Printf(float64(C.go_sin(C.double(3.14)))); }
なにしてるかというと、go_sinというラッパー関数をgo本体から呼び出している。
はまったポイントは、import "C"の置き場所である。
以下のように、空行を挟むと、コンパイルに失敗する。
package main /* #cgo LDFLAGS: -lmath #include <math.h> static double go_sin(double x) { return sin(x); } */ import "C" import "fmt" func main { fmt.Printf(float64(C.go_sin(C.double(3.14)))); }
ちなみに、直接Cの関数を使えるので、以下のようにもかける。というか、こうかく。
package main /* #cgo LDFLAGS: -lmath #include <math.h> */ import "C" import "fmt" func main { fmt.Printf(float64(C.sin(C.double(3.14)))); }
ちなみにCGOの機能をみて、「なんだ、すごく簡単じゃないか。なんでもバインドし放題だぜ」と思ったんだが、これは大きな間違いであった。(その2に続くか?)