Unmarshaling in eine Schnittstelle {} und anschließendes Durchführen einer Typzusicherung
Ich bekomme einstring
durch ein rabbitmq Nachrichtensystem. Vor dem Absenden
Ich benutzejson.Marshal
, konvertiere das Ergebnis instring
und senden Sie durch rabbitmq.
Die Strukturen, die ich konvertiere und sende, können sein: (die Namen und die Größe der Strukturen wurden geändert, aber es sollte keine Rolle spielen)
type Somthing1 struct{
Thing string `json:"thing"`
OtherThing int64 `json:"other_thing"`
}
ode
type Somthing2 struct{
Croc int `json:"croc"`
Odile bool `json:"odile"`
}
Die Nachricht geht perfekt als @ durstring
und wird auf der anderen Seite gedruckt (einige Server)
Bis jetzt funktioniert alles. Jetzt versuche ich, sie wieder in ihre Strukturen umzuwandeln und die Typen zu behaupten.
er erste Versuch ist von:
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:
}
Das funktioniert nicht. Beim Drucken der Art voninput
nach dem Unmarshaling bekomme ichmap[string]interface{}
(?!?)
und noch seltsamer als das, der Map-Schlüssel ist der String, den ich habe und der Map-Wert ist leer.
Ich habe einige andere Versuche gemacht wie:
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:
}
und auch versucht, den Schalter zu schreiben, wie in dieser Antwort erklärt wurde:Golang: Schalter für Nicht-Schnittstellenwert kann nicht eingegeben werden
switch v := interface{}(input).(type)
Noch ohne Erfolg ...
Irgendwelche Ideen