代码之家  ›  专栏  ›  技术社区  ›  Vitaliy Franchook

离开循环后指针变为零

  •  3
  • Vitaliy Franchook  · 技术社区  · 7 年前

    这是我的和平准则:

    candles := make([]*base.OHLCVItem, 100)
    
    for i, item := range msgStrSl {
        newCandle, err := parseCandleFromString(item)
        newCandle.Pair = pair
        newCandle.Timeframe = timeframe
    
        if err != nil {
            bWsLog.WithError(err).Errorf("Failed to parse candle %d.", i)
            continue
        }
    
        if newCandle == nil {
            panic("nil candle")
        }
    
        candles = append(candles, newCandle)
    
        bWsLog.Infof("Sn candle: %d", candles[len(candles)-1].Timestamp)
    }
    
    bWsLog.Info(candles[0])
    bWsLog.Info(candles[1])
    sort.SliceStable(candles, func(i, j int) bool {
        bWsLog.Infof("%d %+v %+v", len(candles), candles[i], candles[j])
        return candles[i].Timestamp < candles[j].Timestamp
    }
    

    循环后的日志表示该值为零。 但循环内部的日志会打印对象(因此此时不是nil) 我是新手,我能弄明白为什么循环结束后slice中的所有元素都变成了零。 你能帮我解决这个问题吗?

    1 回复  |  直到 7 年前
        1
  •  7
  •   Not_a_Golfer    7 年前

    创建一个包含100个指针的列表,所有指针都为零,然后将其附加到该列表中 位置101处 . 打印最后一个元素,它确实不是零-但它也不是第一个。是101、102。。。等等然后打印前两个元素,它们实际上为零。您基本上在100个零的列表中附加了一组指针。

    只需将第一行更改为:

    candles := make([]*base.OHLCVItem, 0, 100)
    

    这将创建一个空片,但容量为100。