2014-12-17 4 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

C.my_buf의 내용으로 이동 슬라이스를 만들려면 :

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

가 이동 배열을 만들려면 ...

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 (로컬 테스트) 예제입니다. 어떤 오류가 발생합니까? 나는 Mac에서 go1.4를 실행 중입니다. – tidwall

+0

아, 나는 cgo가'DEFINE'을 상수로 취급하는지 확인하지 않았습니다. 이 경우에는 효과가 있습니다. 참고 자료 : – JimB

+1

두 번째 예제에서는 데이터를 두 번 복사합니다. – JimB