StoryEdit 開発日誌

ウェブアプリ StoryEditを作ってましたが延期。普通のブログ。

最近はもっぱら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に続くか?)