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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵