2017-04-30 1 views
1

이 질문은 this one과 비슷합니다. 포인터와 길이를 고정 크기 Golang 배열로 변환하고 싶습니다.Go에서 배열에 대한 포인터로 변환

// Slice memory layout 
var sl = struct { 
    addr uintptr 
    len int 
    cap int 
}{addr, length, length} 

// Use unsafe to turn sl into a []byte. 
b := *(*[]byte)(unsafe.Pointer(&sl)) 

어떻게 대신에 지정된 메모리 배열을 만들 것입니다 : 다음과 같이 슬라이스를 들어

solution는 관련 정보를 가진 구조체를 생성하고 직접 캐스팅했다?

+0

package main import ( "fmt" "reflect" "unsafe" ) var data = []byte('foobar') func main() { rv := reflect.ValueOf(data) ptr := rv.Pointer() b := *(*[3]byte)(unsafe.Pointer(ptr)) fmt.Printf("%T %q\n", b, b) } 
[변형 예 슬라이스 (https://play.golang.org/p/H1V_hFZEwc) – mkopriva

+0

@mkopriva LMAO 다시 안녕하세요. 대답을 수락 할 수 있도록 답변으로 게시 할 수 있습니까? – Awn

+0

이제 조금 더 멋진 솔루션으로 답변을 추가했습니다. – mkopriva

답변

1

이 조각처럼, 당신은 배열의 메모리 레이아웃을 정의 할 필요가 없습니다 조각과 거의 동일합니다하지만 이동 배열 그냥 values laid out sequentially 있습니다 때문에 pointer, cap으로 표시되고 반대로, 및 len.

https://play.golang.org/p/r9yi9OdDIC

+0

귀하의 솔루션이 동일한 주소를 설명하지 않는 것 같습니다. 나는 약간의 수정을했다 : https://play.golang.org/p/SZRl-UA3Wu – Awn

+0

또한 캐스팅 된 배열의 크기가 6이되어서는 안된다. – Awn

+0

크기'3'은 원래 배열의 len과 같을 필요가 없다는 것을 보여주는 예입니다. 새로운 배열이 가져야하는 크기는 당신에게 달려 있습니다. 여러분은 그것을'10'으로 설정할 수 있습니다 만, 처음 6 개 요소 이후의 데이터는 가비지 일 수 있습니다. – mkopriva