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 阿里云函数计算自定义层部署LibreOffice
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥30 电脑误删了手机的照片怎么恢复?
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办