taiyoh's memorandum

@ttaiyoh が、技術ネタで気づいたことを書き溜めておきます。

cgoでのバイト列の受け渡し・受け取りについて

 (今年、まだ更新するネタがあったぞ)
 先週末くらいからGoをちょっと触り始めました。まだ始めて通算3日目くらいなんですが、なぜか色々すっ飛ばしてcgoなんてやっております。。。どうぞお手柔らかにお願いします。
 諸事情あって、Goで定義したバイト列をC側で操作して、その結果をGoで受け取ってほにゃららする、って操作がしたくて調べてみました。低レイヤーなライブラリーをいくつか読んでみて、こんな検証コードを作成しました。

 これ、完全に黒魔術や。。。目的のデータのポインタを型に依存しない形で取り出してそのポインタの指すデータをreflect.SliceHeaderでキャストして任意の型で操作できるようにして*1、その構造体のDataのポインタを改めて型に依存しない形で取り出してCにおけるunsignded char *でキャストしてC側の関数に放り込む、ってことらしいですが、自分でも何言ってるかわからない><いや、落ち着いて考えれば「あー」程度には思うのですが、深い理解にはなってないですね。。。
 もともとはあるUSBデバイスのデバイスドライバ+アプリ的なものを作りたくて、当初はnode.jsで目的のことをやろうとしたんですが、結局深いところでの操作はC++が書けないと難しい感じだったんですね。なので、直接C/C++を触る気力のない、というか、デバドラ部分以外はなるべくLL的なものを使いたいゆるふわな僕は、Goを選択した次第であります。Goは、程よく堅くて程よくシンプルに書けるのがいいですね。勿論適材適所だとは思っていますが。

*1:元ページに"Package reflect implements run-time reflection, allowing a program to manipulate objects with arbitrary types."って書いてあるので、よっぽど誤訳してなければ大体そんな感じのはず。。。 http://golang.org/pkg/reflect/