2014-12-17 24 views

cevap

8

kolay ve en güvenli yolu doğrudan bellek kullanmak için [1024]byte

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

değil özellikle bir dilim kopyalamak için geçerli: bir arayüz dönüşümü yapmaya çalışıyor bana bu hata veriyor unsafe.Pointer aracılığıyla "yayınlayabilirsiniz".

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

Özellikle bir dizi istiyorum değil, bir dilim . Bunun nedenlerinden biri de bir kopyasını yapmak istiyorum. Ayrıca, 'C.BUF_SIZE * * sabittir, bu yüzden bir yazım tablosunda kullanabilirim. Ayrıca, neden bir işaretçiye büyük bir diziye dönüştürülür? –

+2

Dev dizisi, go derleyicinin geçerli bir boyutu kabul etmesini sağlayacak, ancak aslında tahsis edilmeyecek (https://github.com/golang/go/wiki/cgo adresindeki diğer örneklere bakınız). – JimB

+0

Aah, şimdi onu kapattığını görüyorum, boşver. –

2

C.my_buf içeriği ile bir Go dilim oluşturmak için:

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

Bir Go dizi oluşturmak için ...

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

@JimB İkinci örnek benim için çalışıyor gibi görünüyor. İşte bir örnek https://play.golang.org/p/O49FFSyHCG (yerel olarak test et) Hangi hatayı alıyorsunuz? Mac’te go1.4’ü çalıştırıyorum. – tidwall

+0

Ah, ben hiç bir zamandan beri 'DEFINE' kelimesinin bir sabit olarak ele alıp almadığını kontrol etmedim. Bu, bu durumda çalışır. – JimB

+1

FYI, ikinci örnek verileri iki kez kopyalar. – JimB

İlgili konular