2 回答

TA貢獻1835條經驗 獲得超7個贊
請參閱將 C 數組轉換為 Go 切片的文檔,以獲取包含 C 數據的可索引 Go 切片。
由于要就地修改 C 緩沖區數據,因此使用 Go 切片作為代理,只需將同一緩沖區傳遞給回調即可。請注意,using 可能會為切片分配一個新的 Go 數組,因此您需要避免這種情況,并確保事先在緩沖區中有足夠的可用空間。append
func goFunction(cBuffer *C.char, length int) {
slice := (*[1 << 28]C.char)(unsafe.Pointer(cBuffer))[:length:length]
// slice can now be modified using Go syntax, without pointer arithmetic
C.callback(cBuffer)
}

TA貢獻1812條經驗 獲得超5個贊
不建議在 Go 中修改 C 結構,或在 C 中修改 Go 結構。在接口 Ref1 中轉換它。
一些特殊函數通過創建數據的副本在Go和C類型之間進行轉換。在偽圍棋定義中
更多,為您提供一種使用零副本轉換字符串的方法,Ref2。
func char2Slice(data unsafe.Pointer, len C.int) []byte {
var value []byte
sH := (*reflect.SliceHeader)(unsafe.Pointer(&value))
sH.Cap, sH.Len, sH.Data = int(len), int(len), uintptr(data)
return value
}
- 2 回答
- 0 關注
- 191 瀏覽
添加回答
舉報