Go言語にforeach
構文はありますか? for
を使ってスライスや配列を繰り返し処理できますか?
http://golang.org/doc/go_spec.html#For_statements
"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
}
アンダースコア_
は、 空白の識別子 で、匿名のプレースホルダーです。
array または slice を繰り返します。
// 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
}
}
次の例は、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 にあります。
シモンズ:それはまた、括弧をぶら下げることはコードの読みやすさのために悪い考えであることを示しています。ヒント:for
条件はaction()
呼び出しの直前に終了します。明らかですね。
あなたの型に対してfor range
を使うことで、戻り値を参照せずに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++
}
以下は、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
はい、 範囲 :
Forループの範囲形式は、スライスまたはマップに対して繰り返します。
スライスをまたぐ場合は、反復ごとに2つの値が返されます。 1つ目はインデックス、2つ目はそのインデックスにある要素のコピーです。
例:
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)
}
}
これは明らかかもしれませんが、次のように配列をインライン化することができます。
package main
import (
"fmt"
)
func main() {
for _, element := range [3]string{"a", "b", "c"} {
fmt.Print(element)
}
}
出力:
abc