首頁 > 後端開發 > Golang > 如何在 Go 中解組未知的 Protobuf 訊息?

如何在 Go 中解組未知的 Protobuf 訊息?

Barbara Streisand
發布: 2024-11-30 09:21:13
原創
945 人瀏覽過

How Can I Unmarshal Unknown Protobuf Messages in Go?

解組未知 Protobuf 訊息的陷阱

proto.Unmarshal 無法處理 interface{} 類型是需要理解的一個重要面向。它的方法簽章規定傳遞一個 proto.Message 參數,由具體的 protobuffer 類型實作。

克服挑戰

處理缺乏額外上下文的原始protobuffer 有效負載時,在位元組切片旁邊至少有一些識別資訊(例如字串或數字)至關重要。該資訊可用於對應到特定的 protobuffer 具體訊息。然後,您可以使用switch 語句實例化適當的類型並將其傳遞給Unmarshal:

擁抱不可預測:解碼完全未知的訊息

在在極少數情況下,您可能會遇到完全未知的protobuffer 有效負載。 protowire 套件提供了一種從中提取一些資訊的解決方案,儘管存在固有的局限性。可以檢索有效負載內容,但語意較弱。

實作細節

這是未知原始訊息的簡化解析器:

示例輸入和輸出

使用示例輸入:

輸出將是:

其他注意事項

  • 如果有效,子訊息將被遞歸解析和儲存。否則,位元組按原樣儲存。
  • 重複欄位不會被明確處理,但可以從解析後重複的 Tag.Num 值推斷出來。
  • 映射在語意上應等同於重複的鍵/值對。
  • 其中一個資訊可能會遺失,只保留集合

替代方案:Any 和Interface{}

雖然Any 最初看起來像是未知訊息的合適選項,但它具有嚴格定義的結構,並且不能用於解碼未知的有效負載。此外,由於其特殊的結構,protowire 不適用於 Any。

以上是如何在 Go 中解組未知的 Protobuf 訊息?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板