Desempacotando em uma Interface {} e Executando Afirmação de Tipo
Eu recebo umstring
através de um sistema de mensagens rabbitmq. Antes de enviar,
eu usojson.Marshal
, converta o resultado emstring
e envie através do rabbitmq.
As estruturas que eu converto e envio podem ser: (alteraram os nomes e o tamanho das estruturas, mas isso não deve importar)
type Somthing1 struct{
Thing string `json:"thing"`
OtherThing int64 `json:"other_thing"`
}
ou
type Somthing2 struct{
Croc int `json:"croc"`
Odile bool `json:"odile"`
}
A mensagem passa perfeitamente como umstring
e é impresso do outro lado (algum servidor)
Até agora tudo funciona. Agora estou tentando convertê-los novamente em suas estruturas e afirmar os tipos.
primeira tentativa é:
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:
}
Isso não funciona. Ao imprimir o tipo deinput
depois de desempacotar eu recebomap[string]interface{}
(?!?)
e ainda mais estranho que isso, a chave do mapa é a string que recebi e o valor do mapa está vazio.
Eu fiz algumas outras tentativas como:
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:
}
e também tentei escrever o switch como foi explicado nesta resposta:Golang: não é possível digitar switch no valor que não é da interface
switch v := interface{}(input).(type)
ainda sem sucesso ...
Alguma ideia?