将结构传递给redigo Send函数会中断该结构,并且数据丢失

将结构传递给redigo Send函数会中断该结构,并且数据丢失,go,redis,Go,Redis,这是我的结构,当我收到一条套接字消息时,我读取JSON,结构中充满了数据,一切都很好。它通过一些函数,但一旦它通过Send函数,它就会以一种奇怪的方式对它进行序列化,最终我会得到一堆数字,当我将其转换为字符串时,数据就会丢失 type Reply struct { Topic string `redis:"topic" json:"topic"` Ref string `redis:"ref" json:"ref"` Payload struct { Status s

这是我的结构,当我收到一条套接字消息时,我读取JSON,结构中充满了数据,一切都很好。它通过一些函数,但一旦它通过Send函数,它就会以一种奇怪的方式对它进行序列化,最终我会得到一堆数字,当我将其转换为字符串时,数据就会丢失

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"`
}
我只想用这种格式广播信息

这就是我得到修改的和有问题的数据的地方

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")
    }
  }
}
Redigo不支持这种类型的数据结构吗

这是我得到的格式,也是我应该得到的格式

//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: {}}}
第55行是我找回“损坏”数据的地方-

Redigo:

Reply
类型正在使用
fmt.Print(v)
进行编码

看起来您希望将该值编码为JSON。如果是,请在应用程序中进行编码。您可以删除
redis
字段标记

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