Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mensiri Struktur dengan Medan Tidak Dieksport ke dalam Tatasusunan Byte dalam Go tanpa Refleksi?
Bagaimanakah cara saya membuang struct ke dalam tatasusunan bait tanpa refleksi?
Anda mungkin telah menemui pengekodan/pakej binari, tetapi ia bergantung pada pakej mencerminkan, yang menimbulkan masalah apabila berurusan dengan struct dengan tidak bermodal (tidak dieksport) medan.
Penyelesaian Alternatif: Memanfaatkan Pakej gob
Untuk memintas pengehadan ini, pertimbangkan untuk menggunakan pakej gob. Dengan melaksanakan antara muka GobDecoder dan GobEncoder, anda boleh mensiri dan menyahsiri medan peribadi dengan selamat dan cekap. Pendekatan ini tidak bergantung pada platform dan hanya memerlukan penambahan fungsi tersebut pada struct dengan medan yang tidak dieksport, meninggalkan seluruh kod anda bersih.
Contoh Pelaksanaan
Begini cara anda boleh melaksanakan kaedah GobEncode dan GobDecode:
func (d *Data) GobEncode() ([]byte, error) { w := new(bytes.Buffer) encoder := gob.NewEncoder(w) err := encoder.Encode(d.id) if err != nil { return nil, err } err = encoder.Encode(d.name) if err != nil { return nil, err } return w.Bytes(), nil } func (d *Data) GobDecode(buf []byte) error { r := bytes.NewBuffer(buf) decoder := gob.NewDecoder(r) err := decoder.Decode(&d.id) if err != nil { return err } return decoder.Decode(&d.name) }
Dalam fungsi utama anda, anda boleh tulis dan baca struct menggunakan pakej gob:
func main() { d := Data{id: 7} copy(d.name[:], []byte("tree")) buffer := new(bytes.Buffer) // writing enc := gob.NewEncoder(buffer) err := enc.Encode(d) if err != nil { log.Fatal("encode error:", err) } // reading buffer = bytes.NewBuffer(buffer.Bytes()) e := new(Data) dec := gob.NewDecoder(buffer) err = dec.Decode(e) fmt.Println(e, err) }
Atas ialah kandungan terperinci Bagaimana untuk Mensiri Struktur dengan Medan Tidak Dieksport ke dalam Tatasusunan Byte dalam Go tanpa Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!