Go中有一个foreach循环吗?

时间:2011-10-16 04:47:33

标签: go foreach slice

Go语言中是否有foreach构造?我可以使用for

迭代切片或数组

8 个答案:

答案 0 :(得分:723)

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

  

A" 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
}

下划线_blank identifier,一个匿名占位符。

答案 1 :(得分:119)

迭代数组切片

// 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
    }
}

答案 2 :(得分:12)

以下示例说明如何在range循环中使用for运算符来实现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的playground

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

答案 3 :(得分:10)

您实际上可以使用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 :(得分:8)

以下是如何在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 :(得分:3)

是,范围

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)
    }
}
  • 您可以通过分配_来跳过索引或值。
  • 如果只需要索引,请完全删除值。

答案 6 :(得分:1)

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

package main

import (
    "fmt"
)

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

输出:

abc

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

答案 7 :(得分:0)

我让我实现了这个库:https://github.com/jose78/go-collection。这是有关如何使用Foreach循环的示例:

with open('docusign.pem', mode='rb') as privatefile:
    private_key_bytes = privatefile.read()
api_client = ApiClient()
oauth_host_name = 'account-d.docusign.com'
# not real, random:
client_id = 'dff16ff1-de93-477d-a73d-3774ac9932dc'
user_id = '7401f22e-ff2c-4777-9117-5932ace2e71a'
expires_in = 3600
result = api_client.request_jwt_user_token(client_id, user_id,
                                       oauth_host_name,
                                       private_key_bytes,
                                       expires_in,
                                       scopes=(OAuth.SCOPE_SIGNATURE,))

执行的结果应该是:

(400)
Reason: Bad Request
HTTP response headers: HTTPHeaderDict({'Cache-Control': 'no-cache', 'Pragma': 'no-cache',
'Content-Type': 'application/json; charset=utf-8', 'Expires': '-1', 'Server':
'Microsoft-IIS/10.0', 'X-AspNetMvc-Version': '5.2', 'X-DocuSign-TraceToken':
'c1d090b7-cefd-4881-80c6-3f1c55ccc5b4', 'X-Content-Type-Options': 'nosniff',
'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload,
max-age=15768000', 'X-Frame-Options': 'SAMEORIGIN', 'X-XSS-Protection': '1; mode=block;
report=/client-errors/xss', 'X-DocuSign-Node': 'DA2DFE179', 'Date':
'Sun, 23 Aug 2020 15:18:46 GMT', 'Content-Length': '28'})
HTTP response body: b'{"error":"consent_required"}'

Try this code in playGrounD