我用以下定義包裝了一個 C 函數:int parser_shift(parser* parser, void* buffer, int length);它從未解析字節的內部緩沖區中刪除最多 length 個字節,并將它們存儲在給定的緩沖區中?,F在我希望將它包裝成一個具有以下定義的 Go 函數:func (p *Parser) Shift() []byte { var buffer []byte // TODO: return buffer}用CGO完成上面的TODO,正確的寫法是什么?我嘗試了以下方法,但它因錯誤而崩潰:“/path/to/my/program”中的錯誤:free():下一個大小無效(快速):0x00007f8fe0000aa0:var buffer []bytebufStr := C.CString(string(buffer))defer C.free(unsafe.Pointer(bufStr))C.parser_shift(p.Cparser, unsafe.Pointer(bufStr), C.int(8192))buffer = []byte(C.GoString(bufStr))return buffer
2 回答

www說
TA貢獻1775條經驗 獲得超8個贊
假設您的parser_shift函數返回實際存儲在緩沖區中的字節數,您可以這樣做:
func (p *Parser) Shift() []byte {
var buffer [8192]byte
parsed := int(C.parser_shift(p.Cparser, unsafe.Pointer(&buffer[0]), C.int(len(buffer))))
return buffer[:parsed]
}
無需與字符串相互轉換,只需將它傳遞給您希望它寫入的內存即可。

慕俠2389804
TA貢獻1719條經驗 獲得超6個贊
試試這個功能
// C pointer, length to Go []byte
func C.GoBytes(unsafe.Pointer, C.int) []byte
- 2 回答
- 0 關注
- 193 瀏覽
添加回答
舉報
0/150
提交
取消