2014-12-17 3 views

ответ

8

Самый простой и безопасный способ это скопировать его на срезе, а не конкретно к [1024]byte

mySlice := C.GoBytes(unsafe.Pointer(&C.my_buff), C.BUFF_SIZE) 

Чтобы использовать память непосредственно без копии , вы можете «отличить» его через unsafe.Pointer.

mySlice := (*[1 << 30]byte)(unsafe.Pointer(&C.my_buf))[:int(C.BUFF_SIZE):int(C.BUFF_SIZE)] 
// or for an array if BUFF_SIZE is a constant 
myArray := *(*[C.BUFF_SIZE]byte)(unsafe.Pointer(&C.my_buf)) 
+0

Я специально хочу массив, а не кусочек , Одна из причин заключается в том, что я хочу сделать копию. Кроме того, 'C.BUF_SIZE' * является * константой, поэтому я могу использовать ее в typedef. Кроме того, зачем преобразовать его в указатель на огромный массив? –

+2

Огромный массив просто так, что компилятор go примет любой допустимый размер, но он фактически не выделен (см. Некоторые другие примеры здесь https://github.com/golang/go/wiki/cgo). – JimB

+0

А теперь я вижу, что ты его закрываешь, неважно. –

2

Чтобы создать фрагмент Go с содержанием C.my_buf:

arr := C.GoBytes(unsafe.Pointer(&C.my_buf), C.BUF_SIZE) 

Чтобы создать массив Go ...

var arr [C.BUF_SIZE]byte 
copy(arr[:], C.GoBytes(unsafe.Pointer(&C.my_buf), C.BUF_SIZE)) 
+1

@JimB Второй пример, похоже, работает на меня. Вот пример https://play.golang.org/p/O49FFSyHCG (тест локально). Какую ошибку вы получаете? Я запускаю go1.4 на Mac. – tidwall

+0

А, я никогда не проверял, не отреагировал ли cgo 'DEFINE' как константа. В этом случае это работает. – JimB

+1

FYI, второй пример дважды копирует данные. – JimB