Unmarshaling In einem Interface{} und Anschließend Ausführen, Geben Sie Behauptung

Bekomme ich eine string durch ein rabbitmq-message-system. Vor dem senden,

Benutze ich json.Marshal konvertieren, das Ergebnis zu string und senden durch
rabbitmq.

Den Strukturen, die ich konvertieren und senden kann: (die Namen geändert und die Größe der Strukturen, aber es sollte keine Rolle spielen)

type Somthing1 struct{
   Thing        string    `json:"thing"`
   OtherThing   int64     `json:"other_thing"`
}

oder

type Somthing2 struct{
   Croc        int       `json:"croc"`
   Odile       bool      `json:"odile"`
}

Die Nachricht geht durch perfekt als string gedruckt
auf der anderen Seite (server)

Bis jetzt funktioniert alles.
Jetzt versuche ich, konvertieren Sie Sie zurück in Ihre Strukturen und die für die Geltendmachung der Arten.

ersten Versuch durch:

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:
}

Funktioniert das nicht. Beim Drucken die Art des input nach Unmarshaling
es ich bekomme map[string]interface{} (?!?)

- und noch seltsamer, als dass der map-key ist der string, den ich bekam und der map-Wert leer ist.

Habe ich einige andere versuche 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, das schreiben der Schalter, wie schon erläutert, die in dieser Antwort:
Golang: nicht Typ-Schalter auf non-Schnittstelle Wert

switch v := interface{}(input).(type)

immer noch ohne Erfolg...

Irgendwelche Ideen?

InformationsquelleAutor Blue Bot | 2016-02-23
Schreibe einen Kommentar