Unmarshaling в интерфейс {}, а затем выполняет утверждение типа
Я получаюstring
через систему сообщений rabbitmq. Перед отправкой
я используюjson.Marshal
, преобразовать результат вstring
и отправить через rabbitmq.
Структуры, которые я конвертирую и отправляю, могут быть: (изменены имена и размер структур, но это не должно иметь значения)
type Somthing1 struct{
Thing string `json:"thing"`
OtherThing int64 `json:"other_thing"`
}
или же
type Somthing2 struct{
Croc int `json:"croc"`
Odile bool `json:"odile"`
}
Сообщение проходит черезstring
и напечатан на другой стороне (какой-то сервер)
До сих пор все работает. Теперь я пытаюсь преобразовать их обратно в их структуры и утверждать типы.
Первая попытка:
func typeAssert(msg string) {
var input interface{}
json.Unmarshal([]byte(msg), &input)
switch input.(type){
case Somthing1:
job := Somthing1{}
job = input.(Somthing1)
queueResults(job)
case Somthing2:
stats := Somthing2{}
stats = input.(Somthing2)
queueStatsRes(stats)
default:
}
Это не работает. При печати типinput
после Unmarshaling это я получаюmap[string]interface{}
(?!?)
и даже более странно, ключ карты - это строка, которую я получил, а значение карты пусто.
Я сделал несколько других попыток, таких как:
func typeAssert(msg string) {
var input interface{}
json.Unmarshal([]byte(msg), &input)
switch v := input.(type){
case Somthing1:
v = input.(Somthing1)
queueResults(v)
case Somthing2:
v = input.(Somthing2)
queueStatsRes(v)
default:
}
а также попытался написать переключатель, как было объяснено в этом ответе:Golang: невозможно набрать переключатель на неинтерфейсном значении
switch v := interface{}(input).(type)
все еще безуспешно ...
Есть идеи?