2016-12-19 3 views
4

Я следую за this учебным пособием и получил часть для сериализации/маршалинга Go структурирует в буфер протокола. У моей структуры есть карта, и я не могу найти никакой документации о том, как обрабатывать маршалинг карты.Как сериализовать карту Go в protobuff

В дальнейшем я хочу сериализации Fields map[string]string:

Перейти структура:

type Note struct { 
    ID  NoteID 
    Fields map[string]string 
} 

Protobuf схема:

package internal; 

message Note { 
    optional int64 ID = 1; 
    optional map<string, string> Fields = 2; 
} 

Go маршалом:

func MarshalNote(n *remember.Note) ([]byte, error) { 
    return proto.Marshal(&Note{ 
     ID: proto.Int64(int64(n.ID)) 
     Fields: proto.??? 
    }) 
} 

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

ответ

3

protobuf - это четко определенный формат поиска и одно из преимуществ его использования, оно генерирует для вас все структуры данных (на вашем любимом языке), используя схему protobuf, например, e.i. вам не нужно делать ручную маршал или немаршаль.

+0

Хотя я склонен согласиться с Яндри здесь, что я также позволю прото создавать для меня заглушки Go, а не пытаться сделать это вручную (это одна большая точка для это) Мне также было бы интересно сделать это вручную. В конце концов, код должен быть там, поскольку его использует автоматическое поколение, возможно, на основе отражения? Я думаю, что это время Звездных войн ... используйте источник :) –

+1

есть пример здесь https://jacobmartins.com/2016/05/24/practical-golang-using-protobuffs/ вы можете проверить сгенерированный код –

+0

Для карты сгенерированные теги выглядят так: 'protobuf:" bytes, 1, rep, name = children "json:" children, omitempty "protobuf_key:" bytes, 1, opt, name = key "protobuf_val:" bytes, 2, opt, name = value "'. –

Смежные вопросы