Go言語のfor文のサンプルです。処理を繰り返す時に使用します。
目次
for文 | for文とは / for文のサンプル / 配列の値を取得 |
while文の無限ループにあたる書き方 | |
break | ループを抜ける(break) / 2重ループでbreakを使用 |
2重ループを抜ける(ラベル) | |
continue | ループの先頭に戻る(continue) / 2重ループでcontinueを使用 |
range | for range文(ループで加算しない) |
for文とは
for 初期化式(1.値を初期化) ; 条件式(2.条件) ; 増減式(3.値を更新) { 繰り返される箇所 } |
- 処理を繰り返す時に使用します。最初にforを書くのでfor文と呼ばれます。繰り返しはループとも呼ばれます。
- 初期化式は、最初に1回だけ実行されます。
- 使用する変数をカウンター変数またはループ変数といいます。変数名はiやjがよく使用されます。
- 条件式がtrueの間、処理を繰り返します。
- 増減式(3.値を更新)でカウンター変数/ループ変数の値が変わります。
- 条件式がfalseになるとループ処理を終了します。
- 以下は、Go言語公式のEffective Goのfor文のリンクです。
https://golang.org/doc/effective_go.html#for
for文のサンプル
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i) // 0 1 2 3 4が出力される
}
}
5行目は、初期化式(i:=0)によりiは0から始まります。
増減式(i++)によりiの値は、1ずつ増えていきます。
条件式(i<5)がtrueの間は処理を繰り返し、iが5になるとfalseになるので終了します。
配列の値を取得
package main
import "fmt"
func main() {
color1 := []string{"赤", "黄", "青"}
for i := 0; i < len(color1); i++ {
fmt.Println(color1[i]) // 赤 黄 青が出力される
}
}
6行目は、配列です。
8行目のlenは、配列の長さを返します。
9行目は、変数と添字で配列の値を表示しています。配列の添字は0から始まります。
while文の無限ループにあたる書き方
Go言語にはwhile文がありません。for文の条件を空白にすると無限ループになります。
package main
import "fmt"
func main() {
for i := 0; ; i++ {
if i == 3 {
break
}
fmt.Println(i) // 0,1,2が出力される
}
}
6行目は、for文の条件がありません。
ループを抜ける(break)
breakでループを抜けるサンプルです。
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
if i == 3 {
break
}
fmt.Println(i) // 0,1,2が出力される
}
}
7行目のbreakでfor文を抜けます。
2重ループでbreakを使用
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 0 {
break
}
fmt.Println("j=", j) //出力なし
}
fmt.Println("i=", i) // i=0,i=1,i=2が出力される
}
}
5,6行目にfor文があり2重ループ(入れ子)になっています。
8行目のbreakは、内側のfor文のみ抜けます。
2重ループを抜ける(ラベル)
package main
import "fmt"
func main() {
label1:
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
if j == 3 {
break label1
}
fmt.Println("j=", j) //0,1,2が出力される
}
fmt.Println("i=", i) // 出力なし
}
fmt.Println("終了") // 出力される
}
7,8行目にforが2つある2重ループです。label1はラベルです。
10行目のbreakとラベルで外側のfor文を抜けます。
ループの先頭に戻る(continue)
for文でcontinueを使用すると、ループ処理の先頭に戻ります。
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
if i == 1 {
continue
}
fmt.Println("i=", i) //i=0 i=2が出力される
}
}
7行目のcontinueでループ処理の先頭の5行目に戻ります。
9行目は、i=0とi=2が出力されます。
2重ループでcontinueを使用
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 0 {
continue
}
fmt.Println("j=", j) //j=1,j=2,j=1,j=2,j=1,j=2が出力される
}
fmt.Println("i=", i) // i=0,i=1,i=2が出力される
}
}
5,6行目にfor文があり2重ループ(入れ子)になっています。
8行目のcontinueは、内側のfor文の先頭の6行目に戻ります。
for range文(ループで加算しない)
for 変数1,変数2 := range 配列などの変数 { 繰り返される箇所 } |
- 上記for文との違いは、変数の値を加算する処理がありません。
- 配列などの要素を順番にアクセスします。
package main
import "fmt"
func main(){
color1 := []string{"赤","黄","青"}
for a, b := range color1{
fmt.Println(a,b) //0 赤 1 黄 2 青が出力される
}
for _, b := range color1{
fmt.Println(b) //赤 黄 青が出力される
}
}
5行目は、配列です。
7行目は、for文+rangeで配列のすべての要素にアクセスします。
8行目は、キーと値を表示します。
11行目は、キーと値のうちの値のみを取得しています。キーに当たる部分をアンダースコア(_)にします。
関連の記事