Démarshalisation des tampons de protocole inconnus dans Go
Lorsque vous travaillez avec des tampons de protocole (protobuf), il est possible de rencontrer des situations où le type de message reçu est inconnu. Cela peut survenir lors de l'écoute de messages provenant de plusieurs sources ou lors du traitement de types de messages dynamiques ou imprévisibles.
La fonction Unmarshal par défaut de Protobuf nécessite qu'un type de message spécifique soit transmis comme argument, mais cela n'est pas réalisable lorsque le message le type est inconnu. Une approche courante consiste à tenter de désorganiser dans une interface {}, mais cela n'est pas pris en charge par la bibliothèque Protobuf.
Résoudre la limitation
Pour gérer les messages inconnus, il est nécessaire de mettre en œuvre une approche personnalisée. Une solution consiste à utiliser le package protowire, qui fournit un accès de bas niveau à la représentation filaire des messages protobuf.
Analyse des messages inconnus
L'extrait de code suivant montre comment pour analyser et extraire des informations à partir de messages protobuf inconnus :
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 { // ... }
La fonction parseUnknown parcourt le tableau d'octets, consomme les champs et extrait des informations de base sur la balise et la valeur de chaque champ.
Extraction de la charge utile
La charge utile de la valeur extraite peut être stockée dans une variété de structures de données, en fonction du type attendu et du contenu du champ. Par exemple :
switch t { case protowire.VarintType: v, vlen := protowire.ConsumeVarint(b[taglen:fieldlen]) case protowire.Fixed64Type: v, vlen := protowire.ConsumeFixed64(b[taglen:fieldlen]) // ... }
Limitations et considérations
Cette approche présente certaines limites :
Alternatives à l'analyse des messages inconnus
Dans la plupart des scénarios, il est préférable d'aborder la question de l'inconnu messages d'un point de vue différent, tels que :
L'approche décrite dans cet article fournit un moyen d'extraire des informations de base à partir de messages inconnus. messages protobuf, mais il doit être utilisé comme solution de secours lorsque d'autres options ne sont pas réalisables.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!