Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mensiri Medan Struktur Tidak Dieksport dengan Cekap dalam Go tanpa Refleksi?
Pensirian Medan Struktur Tidak Dieksport tanpa Refleksi
Mensiri medan struct yang tidak dieksport menggunakan pantulan boleh menyusahkan. Bagaimanakah kita boleh mendekati tugas ini dengan lebih cekap?
Pakej pengekodan/perduaan menyediakan pengekodan/penyahkodan binari, tetapi ia sangat bergantung pada pantulan, yang tidak berfungsi dengan medan yang tidak dieksport.
Menggunakan Pakej gob
Satu penyelesaian yang berkesan ialah menggunakan pakej gob dan melaksanakan struct antara muka GobDecoder dan GobEncoder. Ini membolehkan pensirilan tersuai dan penyahsirilan medan peribadi.
Laksanakan kaedah GobEncode dan GobDecode dalam struct dengan medan yang tidak dieksport. Berikut ialah contoh:
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) }
Contoh Penggunaan:
func main() { d := Data{id: 7} copy(d.name[:], []byte("tree")) // Serialize buffer := new(bytes.Buffer) enc := gob.NewEncoder(buffer) err := enc.Encode(d) if err != nil { log.Fatal("encode error:", err) } // Deserialize buffer = bytes.NewBuffer(buffer.Bytes()) e := new(Data) dec := gob.NewDecoder(buffer) err = dec.Decode(e) fmt.Println(e, err) }
Pendekatan ini membolehkan siri/deserialisasi yang cekap dan bebas platform bagi medan struct yang tidak dieksport, tanpa kekacauan selebihnya kod.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mensiri Medan Struktur Tidak Dieksport dengan Cekap dalam Go tanpa Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!