2016-11-26 4 views
2

В моей системе есть несколько узлов, которые обмениваются данными через RPC. Я пытаюсь отправить интерфейс карты [string] {} на другой узел через RPC. Отправитель использует json.Marshal и приемник использует json.Unmarshal для получения карты. Скажем, на стороне отправителя карта содержит [1] => 2, где 2 имеет тип uint32.
Проблема заключается в том, что Unmarshal пытается найти тип базовых данных и преобразует 2 в тип float64 в соответствии со своим поведением по умолчанию, как указано здесь https://blog.golang.org/json-and-go. Позже, литье float64 в uint32 вызывает панику.Как развязать интерфейс {} с интерфейсом {} в Go

Я ссылался на How to unmarshal json into interface{} in golang?. Но для этого нам нужно знать тип данных. В моем случае данные могут быть любого типа, поэтому я хочу сохранить его как интерфейс {}. Как я могу развязать интерфейс {} с интерфейсом {}?

ответ

3

К сожалению, с помощью пакета encoding/json вы не можете, так как информация о типе не передается, а номера JSON по умолчанию не сортируются в значениях типа float64, если информация о типе отсутствует. Вам нужно будет определить типы struct, где вы явно указываете, что это поле типа uint32.

Альтернативно вы можете использовать encoding/gob, который передает и сохраняет информацию о типе. Смотрите этот пример:

m := map[string]interface{}{"1": uint32(1)} 

b := &bytes.Buffer{} 
gob.NewEncoder(b).Encode(m) 

var m2 map[string]interface{} 
gob.NewDecoder(b).Decode(&m2) 
fmt.Printf("%T\n%#v\n", m2["1"], m2) 

Output (попробовать его на Go Playground):

uint32 
map[string]interface {}{"1":0x1} 

Недостатком gob является то, что это Go-специфический, в отличие от языка и платформы JSON.

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