在Golang中跳过数组的第一个元素

25

我有以下代码段

for _, val := range Arr {
    // something have to do with val
}

Arr中,可能有多个元素。我想跳过Arr的第一个元素,并从第二个元素继续循环。

例如,如果Arr包含{1,2,3,4}。通过查询,我只想取{2,3,4}。

是否有一种方法可以使用范围查询来实现?

5个回答

52
是的。使用这个。
for _, val := range Arr[1:] {
// something to do with val
}

或者如果你可以得到一个空切片:

for i := 1; i < len(Arr); i++ {
// something to do with Arr[i]
}

1
@T.Claverie 很好的发现。我已经编辑过了。我使用了len(Arr),忘记编辑掉另一部分了。 - khrm
第一个版本已经足够了。它更符合惯用语和 Go 的方式。 - Endre Simo
1
你应该尽量避免将变量命名为"l"(小写的L),因为在大多数字体中它看起来太像数字"1"(one)。当我读到你的第二个例子时,我以为它是Arr[1:1](即从第二个位置开始的零长度切片)。 - David Budworth
@DavidBudworth 谢谢,我会遵循你的建议。 - khrm
2
在空切片上无法工作 运行时错误:切片越界。请参考T. Claverie的答案。 - kubanczyk

8

使用标准的for循环或切片操作符:

for _, val := range Arr[1:] {
    // Do something
}

// Or
for i := 1; i < len(Arr); i++ {
    val = Arr[i]
    // Do something
}

2
for i := 1; i < ... 很好地处理了空切片,而其他答案没有提供这个功能。 - kubanczyk
有没有办法合并这两个答案?(它们是相同的,只是分裂了投票...) - Gwyneth Llewelyn

2

将其转换为切片,然后跳过第一个元素(使用范围查询):

package main

import "fmt"

func main() {
    Arr := [...]int{1, 2, 3, 4}
    for _, val := range Arr[1:] {
        fmt.Println(val)
    }
}

使用索引跳过第一个元素(带有范围查询):

package main

import "fmt"

func main() {
    Arr := [...]int{1, 2, 3, 4}
    for i, val := range Arr {
        if i == 0 {
            continue
        }
        fmt.Println(val)
    }
}

使用一个布尔变量跳过第一个元素(在范围查询中):

package main

import "fmt"

func main() {
    Arr := [...]int{1, 2, 3, 4}
    first := true
    for _, val := range Arr {
        if first {
            first = false
            continue
        }
        fmt.Println(val)
    }
}

0

如果你想对第一个值进行不同的操作,可以这样做:

for i, val := range Arr {
   if i == 0 {
       //Ignore or do something with first val   
   }else{
       // something have to do with val
   }
}

-2
for _, val := range Arr[len(Arr)-(len(Arr)-1):] {
    // something have to do with val
}

请使用这个

for _, val := range Arr[1:] {
    // something have to do with val
}

嘿!被踩了,因为 len(Arr)-(len(Arr)-1) = 1(算一下吧!),所以你可以省去两个函数调用(谁知道,可能Go编译器会捕捉到这个),然后你的答案就和 https://dev59.com/iFoU5IYBdhLWcg3we20R#37429331 以及 https://dev59.com/iFoU5IYBdhLWcg3we20R#37429317 一样了。 - Gwyneth Llewelyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接