2017-12-29 8 views
0

저수준 프로젝트에서 Go를 사용하여 데이터를 복사하지 마십시오. 내가 바이트 슬라이스 아무것도 복사하지 않고 구조체 인 것처럼 값을 읽기 위해이 slice of bytespointer of my struct 캐스팅하고 싶은구조체의 포인터로 [] 바이트를 캐스팅하는 방법은 무엇입니까?

type myStruct struct { 
    a uint8 
    b uint8 
} 

:

나는 고정 된 크기의 구조체가있다. C에서

data := []byte{69,0} 

var obj *myStruct 

//something like: 
obj = myStruct(data) 
// or 
obj = &myStruct(data) 

은 다음과 같습니다 가능 obj = (struct myStruct*) data;

  • 인가? 그렇게 할 수있는 해결책은 무엇입니까? 모범 사례?

[] 바이트에 대한 오프셋 및 색인을 사용하여 무효화하고 싶습니다.

슬라이스는 고정 메모리 아니므는, I는 고정 된 어레이에 byte[0:2][]byte 변환함으로써 가능할 것 같다.

답변

2

당신은 바이트 슬라이스의 첫 번째 요소에 포인터를 전달 *myStructunsafe.Pointer 캐스트 할 수 있습니다

import "unsafe" 
... 
obj = (*myStruct)(unsafe.Pointer(&data[0])) 

시험 : https://play.golang.org/p/c7XO3dPKcLu

+0

없음 이동 - 기본 솔루션? 이 솔루션은 [] 바이트의 길이로 작동합니까? 슬라이스의 메모리 맵은 연속적이지 않기 때문에 안전하지 않은 패키지가 복사를 통해 성능을 변경하지 않고 어떻게 처리 할 수 ​​있는지 궁금하다. 벤치 마크를 통해 확인할 것이다. –

+2

@Alexis_FR_JP, 이것은 Go 네이티브이며, 슬라이스는 항상 인접 해 있습니다. – JimB

+0

좋은 점은 이름 때문에 '안전하지 않은'것을 사용하지 않았으며 Rob Pike가 '안전하지 않은'수입품을 가지고 프로덕션에 참가해서는 안된다는 말을 들었 기 때문입니다. 그때 더 많은 것을 집중해야합니다. 고맙습니다! –