Go有没有foreach循环?

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

http://golang.org/doc/go_spec.html#For_statements

具有“范围”子句的“for”语句遍历数组,切片,string或映射的所有条目或通道上接收的值。 对于每个条目,它将迭代值分配给对应的迭代variables,然后执行该块。

举个例子:

 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 } 

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

遍历数组片段

 // 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 := <-theChan } 

以下示例显示如何在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; } 

该示例遍历一组函数来统一函数的error handling。 一个完整的例子是在Google的游乐场 。

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

实际上,您可以使用range而不必通过使用for range反映您的types来引用它的返回值:

 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

以下是如何在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