一个不可思议的问题,大婶们进来看看

weisd · 2016-01-07 13:58:59 · 3714 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2016-01-07 13:58:59 的主题,其中的信息可能已经有所发展或是发生改变。

// 取redigo 连接
    conn := models.Redis(setting.Conf.TimelineRedis).Get()
    defer conn.Close()

    for i, _ := range times {
        // redis key
        key := getTimelineKeyByCode(code, times[i])

        // 接参数发送命令
        err := conn.Send("HMGET", getTimelineArgs(key)...)
        if err != nil {
            return nil, err
        }
    }

    err := conn.Flush()
    if err != nil {
        return nil, err
    }
       list := make([]map[string]string, len(times))
    // arr := make([]map[string]string, 0)
    for i, _ := range times {
        vals, err := redis.Strings(conn.Receive())
        if err != nil {
            return nil, err
        }

        info := make(map[string]string)
        info = getTimelineVals(vals)

        // 没有 数据时
        if len(vals[0]) == 0 {

            // if i == 0 {
            info = emptyInfo
            // } else {
            //     info = arr[i-1]
            // }
            // } else {
            //     info = getTimelineVals(vals)
        }

        info["date"] = times[i]

        log.Info("get %d %v", i, info["date"])

        list[i] = info
        // arr = append(arr, info)
    }

    for j, in := range arr {
        log.Info("set %d %v", j, in["date"])
    }

说明

times := []string{} 是一个09:29~ 15:00 记录时间分钟数的字符串数组

redis.Strings(conn.Receive()) 前面用redigo 去redis取出了对应时间的数据

getTimelineVals() 把结果 拼成一个map[string]string

问题出在中间 // 没有 数据时

我判断当没有当取到的数据是空字符值,赋给一个默认值

只要在if 条件里加上 info = emptyInfo 就会得到如下结果 ,注释掉就正常

输出结果

2016/01/07 21:34:12 [I] get 231 14:50
2016/01/07 21:34:12 [I] get 232 14:51
2016/01/07 21:34:12 [I] get 233 14:52
2016/01/07 21:34:12 [I] get 234 14:53
2016/01/07 21:34:12 [I] get 235 14:54
2016/01/07 21:34:12 [I] get 236 14:55
2016/01/07 21:34:12 [I] get 237 14:56
2016/01/07 21:34:12 [I] get 238 14:57
2016/01/07 21:34:12 [I] get 239 14:58
2016/01/07 21:34:12 [I] get 240 14:59
2016/01/07 21:34:12 [I] get 241 15:00
2016/01/07 21:34:12 [I] set 0 15:00
2016/01/07 21:34:12 [I] set 1 15:00
2016/01/07 21:34:12 [I] set 2 15:00
2016/01/07 21:34:12 [I] set 3 15:00
2016/01/07 21:34:12 [I] set 4 15:00
2016/01/07 21:34:12 [I] set 5 15:00
2016/01/07 21:34:12 [I] set 6 15:00
2016/01/07 21:34:12 [I] set 7 15:00
2016/01/07 21:34:12 [I] set 8 15:00
2016/01/07 21:34:12 [I] set 9 15:00

最后打印输出的时间都变成最后一个元素的时间了!!!

部分代码

var emptyInfo = map[string]string{
    "price": "0",
    "high":  "0",
    "low":   "0",
    "close": "0",
    "vol":   "0",
    "sum":   "0",
}
var timelineFields = []string{
    "price",
    "high",
    "low",
    "close",
    "vol",
    "sum",
}

func getTimelineVals(vals []string) map[string]string {
    info := map[string]string{}
    for i, _ := range timelineFields {
        info[timelineFields[i]] = vals[i]
    }

    return info
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3714 次点击  
加入收藏 微博
1 回复  |  直到 2016-01-07 15:51:42
weisd
weisd · #1 · 9年之前

解决了,原来map是引用

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传