For loop 如何转到切片中的下一项

For loop 如何转到切片中的下一项,for-loop,go,slice,goland,For Loop,Go,Slice,Goland,我编写了以下代码来获取数组中的下一项 count:=len(value.Values) for index, currentRow := range value.Values { var nextRow Value if index< count{ nextRow = value.Values[index+1] fmt.Print(nextRow) } } count:=len(value.Values) 对于索引,currentRow:=范围值。

我编写了以下代码来获取数组中的下一项

count:=len(value.Values)
for index, currentRow := range value.Values {
    var nextRow Value
    if index< count{
    nextRow = value.Values[index+1]
    fmt.Print(nextRow)
    }
}
count:=len(value.Values)
对于索引,currentRow:=范围值。值{
var nextRow值
如果索引<计数{
nextRow=value.Values[索引+1]
格式打印(下一步)
}
}
运行上述代码时,我感到恐慌

Goroutine死机:运行时错误:索引超出范围


任何关于如何从切片中获取下一项的想法。

下一项确实是
值。值[index+1]
,但是如果
index
是最后一个元素的索引,则没有下一项,在这种情况下
index+1
值的无效索引。值
尝试使用它会导致运行时恐慌

因此,请检查索引:

for index, currentRow := range value.Values {
    var nextRow Value
    if index < timeSeriesDataCount && index < len(value.Values)-1 {
        nextRow = value.Values[index+1]
        fmt.Print(nextRow)
    }
}
在这种情况下,您需要考虑的是
value.Values
是否为空,因为如果为空,上述切片操作将再次死机,因此请检查:

if len(value.Values) > 0 {
    for index, currentRow := range value.Values[:len(value.Values)-1] {
        var nextRow Value
        if index < timeSeriesDataCount {
            nextRow = value.Values[index+1]
            fmt.Print(nextRow)
        }
    }
}
如果len(value.Values)>0{
对于索引,currentRow:=范围值.Values[:len(value.Values)-1]{
var nextRow值
如果索引
请注意,我们可以检查
len(value.Values)>1
,因为即使
len=1
不会出现恐慌,也会有
0
迭代


还请注意,在排除最后一个元素的切片上进行测距不会访问最后一个元素(显然),因此,如果要对元素执行任何其他操作,这可能是不可行的,但在您的示例中,它们是等效的。

首先请注意术语:您使用的是切片还是数组?它们不是相同的东西第二,你成功地得到了“下一个项目”,但是当你在最后一个项目上,没有下一个项目,因此恐慌。解决方案取决于你的目标。你想得到什么?@Flimzy是的,我得到了下一个项目,但是当没有下一个项目时,我会感到恐慌。我的目标是从切片中获取下一个项目,如果没有下一个项目,就不会惊慌失措。然后在下面的答案中选择一个解决方案:当你已经在最后一个项目上时跳过检查,或者只迭代
n-1
元素。
if len(value.Values) > 0 {
    for index, currentRow := range value.Values[:len(value.Values)-1] {
        var nextRow Value
        if index < timeSeriesDataCount {
            nextRow = value.Values[index+1]
            fmt.Print(nextRow)
        }
    }
}