Context:
Go에서는 C를 에뮬레이션하려고 할 때 문제가 발생합니다. -구조에 대한 직접 메모리 매핑과 같은 스타일 유형 캐스팅 작업. 이 기사에서는 이러한 변환을 수행하는 데 사용할 수 있는 방법을 자세히 살펴보겠습니다.
unsafe.Pointer를 사용한 유형 캐스팅:
역사적으로 unsafe.Pointer는 직접적인 메모리 조작에 사용되었습니다. 그러나 명시적인 유형 변환이 필요하고 메모리 손상 가능성으로 인해 안전 위험이 있습니다.
<code class="go">import "unsafe" type packet struct { opcode uint16 data [1024]byte } var pkt1 packet ... // Low-level type casting ptr := unsafe.Pointer(&pkt1) raddrPtr := (*uint32)(unsafe.Pointer(uintptr(ptr) + 2))</code>
인코딩/바이너리 패키지:
이러한 문제를 해결하려면, 인코딩/바이너리 패키지는 더 안전하고 편리한 솔루션을 제공합니다. 이 패키지를 사용하면 리틀엔디안, 빅엔디안 등 미리 정의된 인코딩을 사용하여 데이터를 효율적으로 직렬화 및 역직렬화할 수 있습니다.
<code class="go">// Encoding and decoding example package main import ( "bytes" "encoding/binary" "fmt" ) type T struct { A uint32 B float64 } func main() { // Create a struct and write it. t := T{A: 0xEEFFEEFF, B: 3.14} buf := &bytes.Buffer{} err := binary.Write(buf, binary.BigEndian, t) if err != nil { panic(err) } fmt.Println(buf.Bytes()) // Read into an empty struct. t = T{} err = binary.Read(buf, binary.BigEndian, &t) if err != nil { panic(err) } fmt.Printf("%x %f", t.A, t.B) }</code>
인코딩/바이너리 패키지를 사용하면 데이터 크기 및 엔디안 변환을 쉽게 처리할 수 있습니다. , 유형 안전성을 보장하고 성능을 유지합니다.
위 내용은 Go 구조체와 바이트 배열 간 변환 방법: 안전하고 효율적인 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!