Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyahmarshal Penampan Protokol Tidak Diketahui dalam Go?

Bagaimana untuk Menyahmarshal Penampan Protokol Tidak Diketahui dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-23 08:45:15725semak imbas

How to Unmarshal Unknown Protocol Buffers in Go?

Menyahmarshaling Penampan Protokol Tidak Diketahui dalam Go

Apabila bekerja dengan penampan protokol (protobuf), anda mungkin menghadapi situasi di mana jenis mesej diterima tidak diketahui. Ini boleh timbul apabila mendengar mesej daripada berbilang sumber atau apabila berurusan dengan jenis mesej dinamik atau tidak dapat diramalkan.

Fungsi Unmarshal lalai Protobuf memerlukan jenis mesej tertentu untuk dihantar sebagai hujah, tetapi ini tidak boleh dilaksanakan apabila mesej jenis tidak diketahui. Pendekatan biasa ialah cuba menyahmarshal ke dalam antara muka{}, tetapi ini tidak disokong oleh pustaka Protobuf.

Menangani Had

Untuk mengendalikan mesej yang tidak diketahui, adalah perlu untuk melaksanakan pendekatan tersuai. Satu penyelesaian ialah menggunakan pakej protowire, yang menyediakan akses peringkat rendah kepada perwakilan wayar bagi mesej protobuf.

Menghuraikan Mesej Tidak Diketahui

Coretan kod berikut menunjukkan cara untuk menghuraikan dan mengekstrak maklumat daripada mesej protobuf yang tidak diketahui:

type Field struct {
    Tag
    Val
}

type Tag struct {
    Num int32
    Type protowire.Type
}

type Val struct {
    Payload interface{}
    Length int
}

func parseUnknown(b []byte) []Field {
    // ...
}

The Fungsi parseUnknown berulang melalui tatasusunan bait, menggunakan medan dan mengekstrak maklumat asas tentang setiap teg dan nilai medan.

Mengekstrak Muatan

Muatan nilai yang diekstrak boleh disimpan dalam pelbagai struktur data, bergantung pada jenis dan kandungan medan yang dijangkakan. Contohnya:

switch t {
case protowire.VarintType:
    v, vlen := protowire.ConsumeVarint(b[taglen:fieldlen])
case protowire.Fixed64Type:
    v, vlen := protowire.ConsumeFixed64(b[taglen:fieldlen])
// ...
}

Batasan dan Pertimbangan

Pendekatan ini mempunyai had tertentu:

  • Kekaburan: Perwakilan wayar bagi mesej protobuf boleh menjadi samar-samar, menjadikannya sukar untuk menentukan jenis nilai yang tepat dalam beberapa kes.
  • Medan Tidak Diketahui: Mana-mana jenis medan yang tidak diketahui atau tidak disokong tidak akan dihuraikan atau dipelihara.
  • Sub-mesej: Sub-mesej dihuraikan secara rekursif, tetapi maklumat jenis hilang.
  • Diulang Medan: Medan berulang tidak dikendalikan secara eksplisit.

Alternatif untuk Menghuraikan Mesej Tidak Diketahui

Dalam kebanyakan senario, lebih baik mendekati isu yang tidak diketahui mesej dari perspektif yang berbeza, seperti sebagai:

  • Pemetaan ke Mesej Generik: Cipta jenis mesej generik yang boleh merangkum semua medan yang mungkin dan petakan mesej yang tidak diketahui kepada jenis generik ini.
  • Menggunakan Mana-mana Proto: Pertimbangkan untuk menggunakan Sebarang jenis proto untuk merangkum mesej yang tidak diketahui dan mengekalkan maklumat jenis untuk mendapatkan semula kemudian.

Pendekatan yang diterangkan dalam artikel ini menyediakan cara untuk mengekstrak maklumat asas daripada mesej protobuf yang tidak diketahui, tetapi ia harus digunakan sebagai penyelesaian sandaran apabila pilihan lain tidak dapat dilaksanakan.

Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal Penampan Protokol Tidak Diketahui dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn