解組未知 Protobuf 訊息的陷阱
proto.Unmarshal 無法處理 interface{} 類型是需要理解的一個重要面向。它的方法簽章規定傳遞一個 proto.Message 參數,由具體的 protobuffer 類型實作。
克服挑戰
處理缺乏額外上下文的原始protobuffer 有效負載時,在位元組切片旁邊至少有一些識別資訊(例如字串或數字)至關重要。該資訊可用於對應到特定的 protobuffer 具體訊息。然後,您可以使用switch 語句實例化適當的類型並將其傳遞給Unmarshal:
擁抱不可預測:解碼完全未知的訊息
在在極少數情況下,您可能會遇到完全未知的protobuffer 有效負載。 protowire 套件提供了一種從中提取一些資訊的解決方案,儘管存在固有的局限性。可以檢索有效負載內容,但語意較弱。
實作細節
這是未知原始訊息的簡化解析器:
示例輸入和輸出
使用示例輸入:
輸出將是:
其他注意事項
替代方案:Any 和Interface{}
雖然Any 最初看起來像是未知訊息的合適選項,但它具有嚴格定義的結構,並且不能用於解碼未知的有效負載。此外,由於其特殊的結構,protowire 不適用於 Any。
以上是如何在 Go 中解組未知的 Protobuf 訊息?的詳細內容。更多資訊請關注PHP中文網其他相關文章!