Как отлаживать данные в формате Protocol Buffers (Protobuf) в Go?

Ответ

Отладка бинарного формата Protobuf заключается в его преобразовании в человекочитаемый вид. Вот основные способы:

1. Конвертация в текстовый формат

Пакет prototext позволяет преобразовать Protobuf-сообщение в многострочный текстовый формат, который удобно читать.

import "google.golang.org/protobuf/encoding/prototext"

// msg - ваше protobuf-сообщение
textData, err := prototext.MarshalOptions{Multiline: true}.Marshal(msg)
if err != nil {
    // обработка ошибки
}
fmt.Println(string(textData))

2. Конвертация в JSON

JSON — еще один удобный формат для анализа. Пакет protojson решает эту задачу.

import "google.golang.org/protobuf/encoding/protojson"

// msg - ваше protobuf-сообщение
jsonData, err := protojson.MarshalOptions{Multiline: true, Indent: "  "}.Marshal(msg)
if err != nil {
    // обработка ошибки
}
fmt.Println(string(jsonData))

3. Использование утилиты protoc

Если у вас есть бинарные данные в файле или из сетевого трафика, можно использовать компилятор protoc для их декодирования. Для этого нужен .proto файл со схемой.

# my_message.bin содержит бинарные данные
# schema.proto содержит определение MyMessage
protoc --decode=MyMessage schema.proto < my_message.bin

4. Специализированные инструменты

  • grpcurl: Утилита командной строки для взаимодействия с gRPC-сервисами. Позволяет отправлять запросы и просматривать ответы в текстовом виде без написания кода.
  • Postman / Insomnia: Современные API-клиенты поддерживают gRPC, позволяя импортировать .proto файлы и удобно отлаживать запросы/ответы через GUI.

Важно:

  • При отладке всегда проверяйте ошибки, возвращаемые функциями Unmarshal, — они часто указывают на несоответствие данных и схемы.