Rumah >pembangunan bahagian belakang >Golang >Adakah Pengekodan `pengekodan/gob` Go Deterministik, dan Bagaimana Output Deterministik Boleh Dicapai?
Determinisme dalam Pengekodan/Gob
Latar Belakang
Apabila mengekod objek jenis x dan y ke dalam format GOB, jangkaan biasa ialah gob_encode(x) dan gob_encode(y) akan sentiasa menghasilkan jujukan bait yang sama, memandangkan objek adalah sama.
Determinisme Pengekodan GOB
pengekodan/gob menyediakan pelaksanaan pengekodan GOB yang tidak pasti apabila peta terlibat . Ketidakpastian ini timbul daripada susunan lelaran sewenang-wenangnya peta, yang membawa kepada tertib siri yang tidak konsisten semasa pengekodan.
Impak Penentu Jenis
Walau bagaimanapun, untuk nilai bukan peta, pengekodan /gob melaksanakan pendekatan deterministik. Ini kerana setiap item data dalam aliran GOB diawali dengan penentu jenis. Kejadian pertama jenis dalam aliran termasuk definisi jenis lengkap. Kejadian seterusnya daripada jenis yang sama merujuk kepada spesifikasi jenis awal menggunakan rujukan atau pengecam.
Contoh
Dalam contoh berikut, kami mencipta Int struct tersuai dan mengekodnya beberapa kali menggunakan gob pengekod.
type Int struct{ X int } b := new(bytes.Buffer) e := gob.NewEncoder(b) e.Encode(Int{1}) fmt.Println(b.Bytes()) e.Encode(Int{1}) fmt.Println(b.Bytes())
Output:
[23 255 129 3 1 1 3 73 110 116 1 255 130 0 1 1 1 1 88 1 4 0 0 0 5 255 130 1 2 0] [23 255 129 3 1 1 3 73 110 116 1 255 130 0 1 1 1 1 88 1 4 0 0 0 5 255 130 1 2 0 5 255 130 1 2 0]
Walaupun pengekodan awal termasuk definisi jenis penuh, pengekodan seterusnya hanya menghantar rujukan jenis, menghasilkan jujukan bait yang berbeza.
Implikasi
Secara umumnya, melainkan anda benar-benar memerlukan output deterministik, tidak perlu mengambil berat tentang tingkah laku yang disebutkan di atas.
Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa output deterministik boleh dicapai dengan mengelakkan penggunaan peta dan dengan menggunakan berbilang pengekod yang serupa susunan nilai yang dikodkan.
Selain itu, perubahan dalam pelaksanaan pengekodan/gob antara keluaran Go mungkin menjejaskan konsistensi daripada keluaran. Keserasian dikekalkan, tetapi output yang tepat mungkin berbeza-beza.
Atas ialah kandungan terperinci Adakah Pengekodan `pengekodan/gob` Go Deterministik, dan Bagaimana Output Deterministik Boleh Dicapai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!