Konteks:
Dalam Go, cabaran timbul apabila cuba meniru C operasi pemutus jenis gaya, seperti pemetaan ingatan terus ke struktur. Artikel ini akan menyelidiki kaedah yang tersedia untuk mencapai penukaran tersebut.
Taip Casting dengan tidak selamat.Penunjuk:
Secara sejarah, tidak selamat.Penunjuk digunakan untuk manipulasi ingatan langsung. Walau bagaimanapun, ia memerlukan penukaran jenis yang jelas dan membawa risiko keselamatan kerana potensinya untuk kerosakan ingatan.
<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>
Pakej Pengekodan/Perduaan:
Untuk menangani kebimbangan ini, pengekodan/pakej binari menyediakan penyelesaian yang lebih selamat dan mudah. Pakej ini membolehkan pensirilan dan penyahsirilan data yang cekap menggunakan pengekodan pratakrif seperti little-endian dan big-endian.
<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>
Dengan menggunakan pakej pengekodan/perduaan, seseorang boleh mengendalikan saiz data dan penukaran endianness dengan mudah , memastikan keselamatan jenis dan mengekalkan prestasi.
Atas ialah kandungan terperinci Cara Menukar Antara Go Structs dan Byte Arrays: Kaedah Selamat dan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!