DRYな備忘録

Don't Repeat Yourself.

Go言語のcgoことはじめ【golang】【cgo】

背景

みんなだいすきGitHubで、gosseractというGo言語のOCRパッケージをニヤニヤしながらつくっていたら、知らない外人さんから

「いやos/execちゃうくてなんでcgo使わへんの?」

とか言われたのである。

cgoってナニよ?

Goコードの中でC/C++のライブラリをimportしたりC/C++のコードを書いたりできる仕組みのこと、っぽい?



しかし僕はCをやったことが無いのである!

f:id:otiai10:20140624004416p:plain

LLゆとりですとも、ええ。

とりまやってみっか

import "C"の直前にCっぽい定義を書けば、Cパッケージの関数として使えるっぽい感じっぽいので、とりあえず以下のように書きました。

package main

/*
#include <stdio.h>
void review(char* s) {
    printf("[一週間フレンズ] %s", s);
}
*/
import "C"

func main() {
    s := C.CString("ふつうだった\n")
    C.review(s)
}

これを実行すると...

f:id:otiai10:20140624011823j:plain

わりといけそうな気がする

ちなみにcgoの検証にplaygroundが使えない

もちろんまずplaygroundで試そうとしたんだけど、

http://play.golang.org/p/bZW5rXjJHh

playgroundだと必ず

prog.go:9: can't find import: "C"

のエラーが出てこまった。

きっとplaygroundのサーバにはgccが無いんだろうな、と仮定して以下を試してみる。

fuga.go

package main

import "os/exec"
import "fmt"

func main() {
    p, e := exec.LookPath("gcc")
    fmt.Printf("%s | %s", p, e)
}

http://play.golang.org/p/OKgbiNw-yv

これをplaygroundと手元のMacで実行すると...

  • playground「 | exec: "gcc": executable file not found in $PATH
  • MacOS/usr/bin/gcc | %!s()

ビンゴだった。

その後

「tesseract-ocrのソース読んだけど、キツいかもしらん。とりあえず今のまんま行ったら?」

的なアドバイス頂いたでござるw

tesseract呼ぶところのcgo化、v3でチャレンジしたいと思っている。

DRYな備忘録