言語バージョン 1.15.3

公開日 November 10, 2020, GMT+9

更新日 January 26, 2021, GMT+9

for

このページでは豊富な例を用いてGolangのforの使い方を学ぶことができます。

forはGolangの構文の1つです。
array(配列)slice(スライス)map(マップ) と共に使用される場合が多いです。
繰り返し処理をする際に用いられる構文で、指定した条件に合致する間は記述した処理を繰り返し行うことができます。

また、他の言語で用意されているwhileがGolangでは存在しないため、同様の処理を行いたい場合はforで代替する必要があります。

TL;DR

基本

array1 := [3]string{"Apple", "Banana", "Citrus"}
for i := 0; i < len(array1); i++ {
  fmt.Println("I like " + array1[i])
}
==> I like Apple
==> I like Banana
==> I like Citrus
for i := 2; i < len(array1); i++ {
  fmt.Println(array1[i])
}
==> Citrus



slice1 := []int{100, 101, 102}
i := 0
for ; i < len(slice1); i++ {
  fmt.Println(slice1[i])
}
==> 100
==> 101
==> 102



slice2 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var sum int
for i := 0; i < len(slice2); i++ {
  sum += slice2[i]
}
fmt.Println(sum)
==> 55



type Person struct {
  ID   int
  Name string
}
slice3 := []Person{{100, "Jason"}, {300, "Freddy"}}
fmt.Println(slice3)
==> [{100 Jason} {300 Freddy}]
for newId := 0; newId < len(slice3); newId++ {
  slice3[newId].ID = newId
}
fmt.Println(slice3)
==> [{0 Jason} {1 Freddy}]



// 無限ループ
for {
  fmt.Println("This is infinite.")
}
==> 無限ループ

すべての要素を対象とした処理(range)

array1 := [2]string{"Golang", "Fortran"}
for i, v := range array1 {
  fmt.Println(i, v)
}
==> 0 Golang
==> 1 Fortran



// 使用しない値に対しては_(アンダースコア)を割り当てて対応
slice1 := []string{"Scala", "Kotlin", "Groovy"}
for i, _ := range slice1 {
  if i == 2 {
    slice1[i] = "Java"
  }
}
fmt.Println(slice1)
==> [Scala Kotlin Java]



type Language struct {
  Name  string
  IsJVM bool
}
map1 := map[int]Language{0: {"Golang", false}, 1: {"Kotlin", true}}
for _, v := range map1 {
  fmt.Println(v)
}
==> {Golang false}
==> {Kotlin true}



// mapの場合はインデックス番号ではなくキーが第1の返り値
for k, v := range map[string]string{"name": "John", "level": "high"} {
  fmt.Println(k, v)
}
==> name John
==> level high

Golangにおけるwhile

count1 := 0
for count1 < 10 {
  count1++
}
fmt.Println(count1)
==> 10



var slice1 []string
count2 := 0
for count2 <= 10 {
  slice1 = append(slice1, strconv.Itoa(count2))
  count2++
}
fmt.Println(slice1)
==> [0 1 2 3 4 5 6 7 8 9 10]



slice2 := []int{100, 200, 300, 400}
count3 := 0
for count3 < len(slice2) {
  fmt.Println(slice2[count3])
  count3++
}
==> 100
==> 200
==> 300
==> 400

処理のスキップ(continue)

array1 := [4]int{0, 1, 2}
fmt.Println(array1)
==> [0 1 2 0]
for i := 0; i < len(array1); i++ {
  if i < 2 {
    continue
  }
  fmt.Println(array1[i])
}
==> 2
==> 0



// iが偶数の場合に処理をスキップ
var slice1 []string
for i := 0; i < 10; i++ {
  if i % 2 == 0 {
    continue
  }
  slice1 = append(slice1, strconv.Itoa(i))
}
fmt.Println(slice1)
==> [1 3 5 7 9]

処理の停止(break)

var slice1 []int
for i := 0; i < 100; i++ {
  if i > 10 {
    break
  }
  slice1 = append(slice1, i)
}
fmt.Println(slice1)
==> [0 1 2 3 4 5 6 7 8 9 10]



slice2 := []string{"Golang", "Kotlin", "JavaScript"}
for _, v := range slice2 {
  if v == "JavaScript" {
    break
  }
  fmt.Println(v)
}
==> Golang
==> Kotlin

解説

基本

forの後ろに続けて、「1回目の繰り返しが行われる前に実行される処理」、 「それぞれの繰り返し処理が行われる前に評価される条件文」、 「それぞれの繰り返し処理が行われた後に実行される処理」の順番にセミコロン(;)区切りで記述します。

上記3つの記述を省略する書き方も存在し、その場合は無限ループになります。

array1 := [2]int{100, 200}
for i := 0; i < len(array1); i++ {
  fmt.Println(array1[i])
}
==> 100
==> 200



slice1 := []string{"Golang", "Python", "Kotlin"}
for index := 0; index < 1; index++ {
  fmt.Println(slice1[index])
}
==> Golang



// 無限ループ
for {
  fmt.Println("This is infinite.")
}
==> 無限ループ

すべての要素を対象とした処理(range)

rangeを用いることにより、 slicemap などの型のすべての要素を対象とした繰り返し処理を記述することができます。

rangeは2つの返り値を返します。
1つ目はインデックスまたはキー、2つ目はバリューを返します。
_(アンダースコア)を用いることにより返り値を使用しないことを宣言できます。

slice1 := []int{1, 2, 3, 4}
for index, value := range slice1 {
  slice1[index] = value * index
}
fmt.Println(slice1)
==> [0 2 6 12]



map1 := map[int]string{1: "Gopher", 2: "Duke"}
for key, value := range map1 {
  fmt.Printf("key=%v value=%v\n", key, value)
}
==> key=1 value=Gopher
==> key=2 value=Duke

Golangにおけるwhile

Golangにはwhileは存在しません。
他のプログラミング言語のwhileの様な処理を実現したい場合、以下のように記述することで似たような処理を実現できます。

count1 := 0
for count1 < 1000 {
  count1++
}
fmt.Println(count1)
==> 1000



// 1 ~ 100の和
var sum int
count2 := 1
for count2 <= 100 {
  sum += count2
  count2++
}
fmt.Println(sum)
==> 5050

処理のスキップ(continue)

continueを用いることで、繰り返し処理をスキップさせることができます。
スキップされるのはcontinueが評価された繰り返し処理のみで、 continueが評価された以降のすべての繰り返し処理がスキップされるわけではありません。

// キーが"py"のときは処理をスキップ
map1 := map[string]string{"go": "Golang", "py": "Python", "java": "Java"}
for k, v := range map1 {
  if k == "py" {
    continue
  }
  fmt.Println(v)
}
==> Golang
==> Java

処理の停止(break)

breakを用いることでfor文の処理を中断し、for文のブロック外へと抜け出すことができます。
continueと異なり、breakが評価された時点で以降の繰り返し処理すべてが処理されなくなります。

count := 0
// 条件部分がないのでbreakしない限り無限ループのfor文
for i := 0; ; i++ {
  if i > 50 {
    break
  }
  count++
}
fmt.Println(count)
==> 51

1次情報

For - A Tour of Go

Range - A Tour of Go