Go中有一个foreach循环吗?

和自甴很熟 提交于 2020-01-20 04:21:29

Go语言中有一个foreach构造吗? 我可以使用for迭代切片或数组吗?


#1楼

以下示例显示如何在for循环中使用range运算符来实现foreach循环。

func PrintXml (out io.Writer, value interface{}) error {
    var data []byte
    var err error

    for _, action := range []func() {
        func () { data, err = xml.MarshalIndent(value, "", "  ") },
        func () { _, err = out.Write([]byte(xml.Header)) },
        func () { _, err = out.Write(data) },
        func () { _, err = out.Write([]byte("\n")) }} {
        action();
        if err != nil {
            return err
        }
    }
    return nil;
}

该示例遍历函数数组以统一函数的错误处理。 一个完整的例子在Google的游乐场

PS:它还表明,吊括号对代码的可读性不是一个好主意。 提示: for条件在action()调用之前结束。 很明显,不是吗?


#2楼

Go具有foreach的语法。 它支持数组/切片,地图和通道。

遍历数组切片

// index and value
for i, v := range slice {}

// index only
for i := range slice {}

// value only
for _, v := range slice {}

遍历地图

// key and value
for key, value := range theMap {}

// key only
for key := range theMap {}

// value only
for _, value := range theMap {}

遍历一个通道

for v := range theChan {}

在通道上进行迭代等效于从通道接收直到关闭:

for {
    v, ok := <-theChan
    if !ok {
        break
    }
}

#3楼

你可以在实际上的使用range不通过引用它的返回值for range对你的类型:

arr := make([]uint8, 5)
i,j := 0,0
for range arr {
    fmt.Println("Array Loop",i)
    i++
}

for range "bytes" {
    fmt.Println("String Loop",j)
    j++
}

https://play.golang.org/p/XHrHLbJMEd


#4楼

以下是在golang中如何使用foreach的示例代码

package main

import (
    "fmt"
)

func main() {

    arrayOne := [3]string{"Apple", "Mango", "Banana"}

    for index,element := range arrayOne{

        fmt.Println(index)
        fmt.Println(element)        

    }   

}

这是一个正在运行的示例https://play.golang.org/p/LXptmH4X_0


#5楼

这可能很明显,但是您可以像这样内联数组:

package main

import (
    "fmt"
)

func main() {
    for _, element := range [3]string{"a", "b", "c"} {
        fmt.Print(element)
    }
}

输出:

abc

https://play.golang.org/p/gkKgF3y5nmt


#6楼

是的, 范围

for循环的范围形式在切片或映射上迭代。

在切片上进行测距时,每次迭代都会返回两个值。 第一个是索引,第二个是该索引处的元素的副本。

范例:

package main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
    for i, v := range pow {
        fmt.Printf("2**%d = %d\n", i, v)
    }

    for i := range pow {
        pow[i] = 1 << uint(i) // == 2**i
    }
    for _, value := range pow {
        fmt.Printf("%d\n", value)
    }
}
  • 您可以通过指定_来跳过索引或值。
  • 如果只需要索引,请完全删除值。

#7楼

https://golang.org/ref/spec#For_range

带有“ range”子句的“ for”语句遍历数组,切片,字符串或映射的所有条目,或通道上接收到的值。 对于每个条目,它将迭代值分配给相应的迭代变量,然后执行该块。

举个例子:

for index, element := range someSlice {
    // index is the index where we are
    // element is the element from someSlice for where we are
}

如果您不关心索引,则可以使用_

for _, element := range someSlice {
    // element is the element from someSlice for where we are
}

下划线_空白标识符 ,一个匿名占位符。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!