在Go 中解組未知協定緩衝區
使用協定緩衝區(protobuf) 時,可能會遇到收到訊息類型的情況未知。當偵聽來自多個來源的訊息或處理動態或不可預測的訊息類型時,可能會發生這種情況。
Protobuf 的預設 Unmarshal 函數需要將特定的訊息類型作為參數傳遞,但這在訊息時不可行類型未知。常見的方法是嘗試解組到介面{}中,但 Protobuf 庫不支援這種方式。
解決限制
要處理未知訊息,有必要實作自訂方法。一種解決方案是使用 protowire 包,它提供對 protobuf 訊息的線路表示的低階存取。
解析未知訊息
以下程式碼片段示範如何從未知的protobuf 訊息中解析並擷取訊息:
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 { // ... }
parseUnknown 迭代函數位元組數組,使用字段並提取有關每個字段的標籤和值的基本資訊。
提取有效負載
提取的值有效負載可以儲存在各種資料結構中,取決於欄位的預期類型和內容。例如:
switch t { case protowire.VarintType: v, vlen := protowire.ConsumeVarint(b[taglen:fieldlen]) case protowire.Fixed64Type: v, vlen := protowire.ConsumeFixed64(b[taglen:fieldlen]) // ... }
限制和注意事項
這種方法有一定的限制:
- 歧義: protobuf 訊息的線路表示可能不明確,因此很難確定值的確切類型在某些情況下。
- 未知欄位:任何未知或不支援的欄位類型都不會被解析或保留。
- 子訊息:子-訊息被遞歸解析,但類型資訊是遺失。
- 重複欄位: 未明確處理重複欄位。
解析未知訊息的替代方法
在大多數情況下,最好從不同的角度來處理未知訊息的問題,例如下:
- 映射到通用訊息:建立一個通用訊息類型,可以封裝所有可能的字段,並將未知訊息映射到此通用類型。
- 使用Any Proto: 考慮使用Any proto 類型來封裝未知訊息並保留類型資訊以供以後使用
本文描述的方法提供了一種從未知的protobuf 訊息中提取基本資訊的方法,但當其他選項不可行時,應將其用作後備解決方案。
以上是如何在 Go 中解組未知協定緩衝區?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Go的"strings"包提供了豐富的功能,使字符串操作高效且簡單。 1)使用strings.Contains()檢查子串。 2)strings.Split()可用於解析數據,但需謹慎使用以避免性能問題。 3)strings.Join()適用於格式化字符串,但對小數據集,循環使用 =更有效。 4)對於大字符串,使用strings.Builder構建字符串更高效。

Go語言使用"strings"包進行字符串操作。 1)拼接字符串使用strings.Join函數。 2)查找子串使用strings.Contains函數。 3)替換字符串使用strings.Replace函數,這些函數高效且易用,適用於各種字符串處理任務。

資助bytespackageingoisesential foreffited byteSemanipulation,uperingFunctionsLikeContains,index,andReplaceForsearchingangingAndModifyingBinaryData.itenHancesperformanceNandCoderAceAnibility,MakeitiTavitalToolToolToolToolToolToolToolToolToolForhandLingBinaryData,networkProtocols,networkProtocoLss,networkProtocols,andetFilei

Go語言使用"encoding/binary"包進行二進制編碼與解碼。 1)該包提供binary.Write和binary.Read函數,用於數據的寫入和讀取。 2)需要注意選擇正確的字節序(如BigEndian或LittleEndian)。 3)數據對齊和錯誤處理也是關鍵,確保數據的正確性和性能。

1)usebybytes.joinforconcatenatinges,2)bytes.bufferforincrementalwriting,3)bytes.indexorbytes.indexorbytes.indexbyteforsearching bytes.bytes.readereforrednorederencretingnchunknunknchunknunk.sss.inc.softes.4)

theencoding/binarypackageingoiseforporptimizingBinaryBinaryOperationsDuetoitssupportforendiannessessandefficityDatahandling.toenhancePerformance:1)usebinary.nativeendiandiandiandiandiandiandiandian nessideendian toavoid avoidByteByteswapping.2)

Go的bytes包主要用於高效處理字節切片。 1)使用bytes.Buffer可以高效進行字符串拼接,避免不必要的內存分配。 2)bytes.Equal函數用於快速比較字節切片。 3)bytes.Index、bytes.Split和bytes.ReplaceAll函數可用於搜索和操作字節切片,但需注意性能問題。

字節包提供了多種功能來高效處理字節切片。 1)使用bytes.Contains檢查字節序列。 2)用bytes.Split分割字節切片。 3)通過bytes.Replace替換字節序列。 4)用bytes.Join連接多個字節切片。 5)利用bytes.Buffer構建數據。 6)結合bytes.Map進行錯誤處理和數據驗證。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)