Is there a foreach loop in Go?
Is there a foreach
construct in the Go language? Can I iterate over a slice or array using a for
?
http://golang.org/doc/go_spec.html#For_statements
A "for" statement with a "range" clause iterates through all entries of an array, slice, string or map, or values received on a channel. For each entry it assigns iteration values to corresponding iteration variables and then executes the block.
As an example:
for index, element := range someSlice {
// index is the index where we are
// element is the element from someSlice for where we are
}
If you don't care about the index, you can use _
:
for _, element := range someSlice {
// element is the element from someSlice for where we are
}
The underscore, _
, is the blank identifier, an anonymous placeholder.
Iterate over array or slice :
// index and value
for i, v := range slice {}
// index only
for i := range slice {}
// value only
for _, v := range slice {}
Iterate over a map :
// key and value
for key, value := range theMap {}
// key only
for key := range theMap {}
// value only
for _, value := range theMap {}
Iterate over a channel :
for v := range theChan {}
Iterating over a channel is equivalent to receiving from a channel until it is closed:
for {
v, ok := <-theChan
if !ok {
break
}
}
The following example shows how to use the range
operator in a for
loop to implement a foreach
loop.
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;
}
The example iterates over an array of functions to unify the error handling for the functions. A complete example is at Google´s playground.
PS: it shows also that hanging braces are a bad idea for the readability of code. Hint: the for
condition ends just before the action()
call. Obvious, isn't it?
上一篇: 将具有匿名函数的代码转换为PHP 5.2
下一篇: Go有没有foreach循环?