8

Go からライブラリ バインディングを開発するために cgo を使用しています。以下のように C 構造体と Go Struct を考えてみましょう。

struct cons_t {
  size_t type;
  cons_t *car;
  cons_t *cdr;
};

cons_t* parse(const char *str);

これはgoの構造体です

type Cons struct {
  type int;
  car *Cons;
  cdr *Cons;
}

以下のように Go 関数を実装するには、TranslateCCons2GoCons を実装するより良い方法は何ですか?

func Parse (str string) *Cons {
  str_ptr := C.CString(string);
  cons_ptr := C.parse(str_ptr);
  retCons := TranslateCCons2GoCons(cons_ptr);
  return retCons;
}

私の最初の答えは以下の通りです。

/*#cgo
int getType(cons_t *cons) {
    return cons->type;
}
cons_t *getCar(cons_t *cons) {
  return cons->car;
}
cons_t *getCdr(cons_t *cons) {
  return cons->cdr;
}
*/

func TranslateCCons2GoCons (c *C.cons_t) Cons {
  type := C.getType(c);
  car := C.getCar(c);
  cdr := C.getCdr(c);
  // drop null termination for simplicity
  return Cons{type, TranslateCCons2GoCons(car), TranslateCCons2GoCons(cdr)};
}

何か良い方法はありますか?

4

2 に答える 2