离开循环后,指针变为零

时间:2018-02-24 22:15:13

标签: loops pointers go null slice

这是我的代码的和平:

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。 但是循环中的log会打印出对象(所以那时它不是一个零) 我是Go的新手,我可以弄清楚为什么切片中的所有元素在循环结束后变为零。 你能帮帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:7)

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

只需将第一行更改为:

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

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