我使用cgo來開發來自Go的庫結合。 讓我考慮下面的C結構和Go結構。好的或推薦的方法來將C結構轉換成結構
struct cons_t {
size_t type;
cons_t *car;
cons_t *cdr;
};
cons_t* parse(const char *str);
,這是去的結構
type Cons struct {
type int;
car *Cons;
cdr *Cons;
}
對於如下實施去功能,什麼是實現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)};
}
有沒有更好的辦法?
當然,如果它沒有被'parse'存儲,你只能釋放它。 :)在這種情況下,您通常將CString存儲在未導出的字段中,稍後再調用'C.free'。 – LinearZoetrope
@JamesHenstridge謝謝你。這似乎更簡單。 – shinpei