背景
みんなだいすきGitHubで、gosseractというGo言語のOCRパッケージをニヤニヤしながらつくっていたら、知らない外人さんから
とか言われたのである。
cgoってナニよ?
- cgo - The Go Programming Language
- C? Go? Cgo! - The Go Blog
- cgo - go-wiki - Tips for interfacing with C code and libraries using cgo. - Go Language Community Wiki - Google Project Hosting
- cgo の基本的な使い方とポインタ周りのTips (Go v1.2) - LESS IS MORE
- Go言語からC言語の関数を呼び出す - schima.hatenablog.com
Goコードの中でC/C++のライブラリをimportしたりC/C++のコードを書いたりできる仕組みのこと、っぽい?
しかし僕はCをやったことが無いのである!
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) }
これを実行すると...
わりといけそうな気がする
ちなみに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で実行すると...
ビンゴだった。
その後
「tesseract-ocrのソース読んだけど、キツいかもしらん。とりあえず今のまんま行ったら?」
的なアドバイス頂いたでござるw
tesseract呼ぶところのcgo化、v3でチャレンジしたいと思っている。
DRYな備忘録