Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
goto / ラベル
Goでは『goto』文を使って指定したラベルに処理をジャンプさせることができます。また、ループに名前(ラベル)を付けて、ネストされたループの外側を一度に脱出したり、継続したりすることができます。
構文
// gotoで指定ラベルにジャンプします。
goto ラベル名
// ラベルの定義(コロンを末尾に付けます)
ラベル名:
// 処理
// ラベル付きbreak(外側のループを脱出します)
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 1 {
break outer // outerラベルのforループを抜けます。
}
}
}
// ラベル付きcontinue(外側のループを続けます)
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 1 {
continue outer // outerラベルのforループの次の反復に進みます。
}
}
}
構文一覧
| 構文 | 概要 |
|---|---|
| goto ラベル | 指定したラベルの位置に無条件でジャンプします。 |
| ラベル: (break用) | ネストされたループの外側を一度に脱出するために使います。 |
| ラベル: (continue用) | ネストされたループで外側のループの次の反復に進むために使います。 |
サンプルコード
package main
import "fmt"
func main() {
// gotoで処理をスキップします(エラー処理のパターン)
x := 5
if x < 0 {
goto errorHandler
}
fmt.Println("xは正の数です:", x)
goto done // errorHandlerをスキップします。
errorHandler:
fmt.Println("エラー: xが負の値です")
done:
fmt.Println("処理終了")
fmt.Println()
// ラベル付きbreakでネストされたループを脱出します。
fmt.Println("ラベル付きbreak:")
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 1 {
fmt.Printf(" i=%d, j=%d でouterを脱出します\n", i, j)
break outer // 外側のループごと抜けます。
}
fmt.Printf(" i=%d, j=%d\n", i, j)
}
}
fmt.Println()
// ラベル付きcontinueで外側のループの次の反復へ進みます。
fmt.Println("ラベル付きcontinue:")
loop:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 1 {
continue loop // 外側のループの次のiへ進みます。
}
fmt.Printf(" i=%d, j=%d\n", i, j)
}
}
}
概要
Goにおいて『goto』は限定的に使用可能で、同じ関数内のラベルへのみジャンプできます。変数宣言をスキップするようなジャンプはコンパイルエラーになります。実務ではエラーハンドリングのパターンなど一部のケースで使われることがありますが、多くの場合はラベル付きの『break』や『continue』の方が可読性が高いです。
gotoを多用するとコードの流れが追いにくくなります。ネストされたループの脱出にはラベル付きbreakを、エラー処理には関数の早期returnを使うことを優先してください。
ループの基本については『for』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。