2 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
請(qǐng)參閱將 C 數(shù)組轉(zhuǎn)換為 Go 切片的文檔,以獲取包含 C 數(shù)據(jù)的可索引 Go 切片。
由于要就地修改 C 緩沖區(qū)數(shù)據(jù),因此使用 Go 切片作為代理,只需將同一緩沖區(qū)傳遞給回調(diào)即可。請(qǐng)注意,using 可能會(huì)為切片分配一個(gè)新的 Go 數(shù)組,因此您需要避免這種情況,并確保事先在緩沖區(qū)中有足夠的可用空間。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貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
不建議在 Go 中修改 C 結(jié)構(gòu),或在 C 中修改 Go 結(jié)構(gòu)。在接口 Ref1 中轉(zhuǎn)換它。
一些特殊函數(shù)通過(guò)創(chuàng)建數(shù)據(jù)的副本在Go和C類型之間進(jìn)行轉(zhuǎn)換。在偽圍棋定義中
更多,為您提供一種使用零副本轉(zhuǎn)換字符串的方法,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 關(guān)注
- 198 瀏覽
添加回答
舉報(bào)