Go에서 구조체와 바이트 배열 간 변환
Go에서는 구조체와 바이트 배열 간에 변환이 필요한 상황에 직면할 수 있습니다. 또는 유형 캐스팅 및 메모리 복사와 같은 C와 유사한 작업을 수행합니다. 이 기사에서는 이러한 작업에 대한 솔루션을 살펴봅니다.
유형 캐스팅
Go는 C와 유사한 유형 캐스팅을 지원하지 않지만 unsafe.Pointer 유형을 사용하여 유사한 작업을 수행할 수 있습니다. 운영. 구조체를 바이트 배열로 변환하려면 unsafe.Pointer() 함수를 사용하여 구조체의 주소를 포인터로 변환하세요.
<code class="go">type packet struct { opcode uint16 data [1024]byte } var pkt1 packet // Convert pkt1 to a byte array byteArray := (*[unsafe.Sizeof(pkt1)]byte)(unsafe.Pointer(&pkt1))</code>
바이트 배열을 다시 구조체로 변환하려면 unsafe.Pointer를 사용하세요. () 함수를 다시 사용하여 바이트 배열 포인터를 원하는 구조체 유형으로 캐스팅합니다.
<code class="go">// Convert byteArray back to a packet struct pkt2 := *(**packet)(unsafe.Pointer(&byteArray))</code>
Memory Copy
Go에는 memcpy와 직접적으로 동일한 기능이 없습니다. () 함수에서는 copy() 함수를 사용하여 메모리 복사를 수행할 수 있습니다. 바이트 배열의 데이터를 구조체로 복사하려면 다음 구문을 사용할 수 있습니다.
<code class="go">type file_info struct { file_size uint32 // 4 bytes file_name [1020]byte } var file file_info copy(unsafe.Pointer(&file), pkt1.data) // Copy data from pkt1.data to file</code>
인코딩/바이너리 패키지 사용
대신 unsafe.Pointer를 사용하면 인코딩/바이너리 패키지를 사용하여 구조체와 바이트 배열 간의 유형 변환을 처리할 수 있습니다. 이 패키지는 바이너리 형식의 데이터를 인코딩 및 디코딩하는 기능을 제공하므로 엔디안 및 데이터 크기를 더 쉽게 처리할 수 있습니다.
<code class="go">// Convert a struct to a byte array t := T{A: 0xEEFFEEFF, B: 3.14} var buf bytes.Buffer binary.Write(&buf, binary.BigEndian, t) // Encode struct t to buf // Convert a byte array to a struct t2 := T{} binary.Read(&buf, binary.BigEndian, &t2) // Decode byte array buf into struct t2</code>
위 내용은 다음은 '방법' 형식을 염두에 두고 기사 내용에 맞는 몇 가지 질문 기반 제목입니다. * Go에서 구조체와 바이트 배열 사이를 어떻게 변환합니까? * 바이트 배열로 구조화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!