私はCプログラムからGolangにいくつかのデータを送信しようとしています。データは生のC構造体によって表されます。私はGolangで非整理しようとしています。CとGolangで構造体定義を共有する最良の方法は何ですか
このようなサンプル:
typedef struct tagA {
int64_t a;
int64_t b;
char c[1024];
}A;
方法はGolang構造体にこのC構造体を書き換えることです。
type A struct{
a int64
b int64
c [1024]byte
}
そしてencoding/binary
を使用して、それに生データバイトストリームを変換しますと言います。しかし、この方法を使うと、相互に関連する2つの構造体を維持する必要があります。
もう1つの方法はCgo
を使用し、この構造体を含むC言語のヘッドファイル(.h
)をインポートし、C.A
と安全でない点を使用して生データを構造体C.Aに変換します。しかし、どうにかしてバグがあり、Cのchar配列をGolang文字列に変換するためにクラッシュしました。
あなたのオプションは何ですか?なにか提案を? CGOを使用して
これは非常に悪いアプローチです。シリアルデータフォーマットを定義し、両側のビットシフト/マスキングで適切なシリアル化を使用します。これについての簡単な検索で十分なQ&Aがあります。 – Olaf
ありがとう@Olaf、カプセル化フィールドを変更すると、両方のサイドコードシェルが変更されますか? 1つの場所で定義を「共有」するアプローチはありますか? – LiLinZhe
@LiLinZhe、 "Protocol Buffers"やFlatBuffersのようなスキーマでserializtionプロトコルを使うことができます – JimB