【问题标题】:pointers became nil after leaving the loop离开循环后指针变为 nil
【发布时间】:2018-08-04 17:01:51
【问题描述】:

这是我的代码:

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。 但是在循环内记录会打印对象(因此此时它不是零) 我是 Go 新手,我可以弄清楚为什么在循环结束后 slice 中的所有元素都变成了 nil 。 你能帮我解决这个问题吗?

【问题讨论】:

    标签: loops pointers go null slice


    【解决方案1】:

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

    只需将第一行更改为:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多