2014-12-17 25 views
5

Come faccio a convertire questo C (array) tipo:Come convertire [1024] C.char a [1024] byte

char my_buf[BUF_SIZE]; 

a questa Go (array) digitare:

type buffer [C.BUF_SIZE]byte 

? Cercando di fare una conversione di interfaccia mi dà questo errore:

cannot convert (*_Cvar_my_buf) (type [1024]C.char) to type [1024]byte 

risposta

8

Il modo più semplice e più sicuro è quello di copiarlo su una fetta, non specificamente per [1024]byte

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

di utilizzare la memoria direttamente senza una copia , puoi "lanciarlo" attraverso un 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

voglio specificamente un array, non una fetta . Uno dei motivi è che voglio fare una copia. Inoltre, 'C.BUF_SIZE' * è * una costante, quindi posso usarlo in un typedef. Inoltre, perché convertirlo in un puntatore a un enorme array? –

+2

L'enorme array è in modo tale che il compilatore go accetterà qualsiasi dimensione valida, ma non è effettivamente allocata (vedere alcuni altri esempi qui https://github.com/golang/go/wiki/cgo). – JimB

+0

Aah, ora capisco che lo copri, non importa. –

2

Per creare una fetta di andare con il contenuto della C.my_buf:

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

Per creare un array Go ...

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

@JimB Il secondo esempio sembra funzionare per me. Ecco un esempio https://play.golang.org/p/O49FFSyHCG (test localmente) Che errore ottieni? Sto usando go1.4 su un Mac. – tidwall

+0

Ah, non ho mai controllato se Cgo considera DEFINE come una costante. Questo funziona in questo caso. – JimB

+1

FYI, il secondo esempio copia i dati due volte. – JimB