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
を用いることにより、
slice
や
map
などの型のすべての要素を対象とした繰り返し処理を記述することができます。
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