doujiang1913 2017-10-02 04:14
浏览 324
已采纳

将结构传递给redigo Send函数会破坏它,并且数据丢失

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

  • 写回答

1条回答 默认 最新

  • dsajkdadsa14222 2017-10-02 06:13
    关注

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用