简体   繁体   中英

Passing a Struct to the redigo Send function breaks it and data is missing

This is my struct, when I get a socket message I readJson and the structs gets filled with the data and all is fine. It goes through some functions, but once it goes through the Send function it serializes it in a weird way that eventually I get back a bunch of numbers and when I convert it to string, data is missing.

type Reply struct {
  Topic   string `redis:"topic" json:"topic"`
  Ref string `redis:"ref" json:"ref"`
  Payload struct {
      Status string `redis:"status" json:"status"`
      Response map[string]interface{} `redis:"response" json:"response"`
  } `json:"payload"`
}

I just want to broadcast messages in this format.

This is where I get the modified and problematic data

func (rr *redisReceiver) run() error {
  l := log.WithField("channel", Channel)
  conn := rr.pool.Get()
  defer conn.Close()
  psc := redis.PubSubConn{Conn: conn}
  psc.Subscribe(Channel)
  go rr.connHandler()
  for {
    switch v := psc.Receive().(type) {
    case redis.Message:
        rr.broadcast(v.Data)
    case redis.Subscription:
        l.WithFields(logrus.Fields{
            "kind":  v.Kind,
            "count": v.Count,
        }).Println("Redis Subscription Received")
        log.Println("Redis Subscription Received")
    case error:
        return errors.New("Error while subscribed to Redis channel")
    default:
        l.WithField("v", v).Info("Unknown Redis receive during subscription")
        log.Println("Unknown Redis receive during subscription")
    }
  }
}

Does Redigo not support that type of data structure?

This is the format I get and the format I'm supposed to get.

//Get
"{{spr_reply sketchpad map[] 1} {ok map[success:Joined successfully]}}"
//Supposed to get
{event: "spr_reply", topic: "sketchpad", ref: "45", payload: {status: 
"ok", response: {}}}

On line 55 is where I get back the "corrupted" data - https://play.golang.org/p/TOzJuvewlP

Redigo supports the following conversions to Redis bulk strings :

Go Type                 Conversion
[]byte                  Sent as is
string                  Sent as is
int, int64              strconv.FormatInt(v)
float64                 strconv.FormatFloat(v, 'g', -1, 64)
bool                    true -> "1", false -> "0"
nil                     ""
all other types         fmt.Print(v)

The Reply type is encoding using fmt.Print(v) .

It looks like you want to encode the value as JSON. If so, do the encoding in the application. You can remove the redis field tags.

writeToRedis(conn redis.Conn, data Reply) error {
    p, err := json.Marshl(data)
    if err != nil {
        return errors.Wrap(err, "Unable to encode message to json")
    }
    if err := conn.Send("PUBLISH", Channel, p); err != nil {
        return errors.Wrap(err, "Unable to publish message to Redis")
    }
    if err := conn.Flush(); err != nil {
        return errors.Wrap(err, "Unable to flush published message to Redis")
    }
    return nil
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM