Go言語を学んでいく 第2弾:基本的なステートメント
第1弾ではGo言語の基礎的なところをやってきました。
iristech.hatenablog.com
今回はGo言語の基本的なステートメントについて学んでいきましょう。
ifステートメント
他の言語と同じように、シンプルに書くことができます。
package main import ( "fmt" ) func main() { x := "rainy" if x == "sunny" { fmt.Println("Happy day.") }else if x == "cloudy" { fmt.Println("Not bad.") }else if x == "rainy" { fmt.Println("Bad day.") } }
さらにGo言語では条件式の直前に実行する、簡易ステートメントを記述できます。
つまり x := "rainy"の部分を、if文の中に埋め込めます。
ただし変数はスコープはif文内のみとなりますので、外側では使用できません。
package main import ( "fmt" ) func main() { if x := "rainy"; x == "sunny" { fmt.Println("Happy day.") } else if x == "cloudy" { fmt.Println("Not bad.") } else if x == "rainy" { fmt.Println("Bad day.") } // xはスコープ外になる // fmt.Println(x) ⇒ NG }
switchステートメント
式switch
JavaやC#と異なり、breakを記述せずとも、case節が終わると次のcase節に行かず、そのままswitch文は終了します。
もし次のcase節に行ってほしい場合は、fallthroughステートメントを使用します。
package main import ( "fmt" ) func main() { x := "rainy" switch x { case "sunny": fmt.Println("Happy day.") case "cloudy": fmt.Println("Not bad.") case "rainy": fallthrough default: fmt.Println("Bad day.") } }
こちらもif文同様に、簡易ステートメントを記述することが可能です。
package main import ( "fmt" ) func main() { switch x := "rainy"; x { case "sunny": fmt.Println("Happy day.") case "cloudy": fmt.Println("Not bad.") case "rainy": fallthrough default: fmt.Println("Bad day.") } }
またswitch式が空の場合は、trueと記述した場合と同じ扱いになります。
package main import ( "fmt" ) func main() { x := "rainy" switch { case x == "sunny": fmt.Println("Happy day.") case x == "cloudy": fmt.Println("Not bad.") case x == "rainy": fallthrough default: fmt.Println("Bad day.") } }
型switch
式switchでは値の比較を行っていました。
型switchでは型の比較を行って、条件分岐していきます。
package main import ( "fmt" ) func main() { var x interface{} = "rainy" switch x.(type) { case nil: fmt.Println("This is nil.") case int: fmt.Println("This is int.") case string: fmt.Println("This is string.") default: fmt.Println("Other type.") } }
※インターフェースに関しては、第5回で解説します。
forステートメント
forステートメントに関しては、他言語とそこまで違いはありません。
package main import ( "fmt" ) func main() { for i := 0; i < 10; i++ { fmt.Println(i) } }
条件部分以外は省略可能なので、以下のように書き換えることもできます。
package main import ( "fmt" ) func main() { i := 0 for i < 10 { fmt.Println(i) i += 1 } }
続いて
を見てみましょう。
package main import ( "fmt" ) func main() { for i := 0; i < 10; i++ { if i == 6 { break } if i%2 == 1 { continue } fmt.Println(i) } }
ちなみに他言語にあるwhileやuntilなどは、forステートメントで記載できるので、Go言語に存在しません。
gotoステートメント
そこまで頻出するステートメントではありませんが、覚えておいた方がいいgotoステートメント。
gotoステートメントは指定したラベルへジャンプすることができます。
下記の例ではラベルL1にジャンプしています。
package main import ( "fmt" ) func main() { weather := "sunny" if weather == "sunny" { goto L1 } fmt.Println("bad weather but ") L1: fmt.Println("happy days") }
gotoで使えるのは2重ループの時などで、ループを脱出したいときです。
breakステートメントは、最も近いループの脱出しかできないため、2重ループの場合、2回breakを書かなければなりません。
package main import ( "fmt" ) func main() { doBreak := false for i := 0; i < 10; i++ { for j := 10; j > 0; j-- { if i == j { doBreak = true break } fmt.Println(i, j) } if doBreak { break } } fmt.Println("END") }
対してgotoだと簡単に脱出できます。
余計なdoBreak変数も使わずに済みます。
package main import ( "fmt" ) func main() { for i := 0; i < 10; i++ { for j := 10; j > 0; j-- { if i == j { goto L1 } fmt.Println(i, j) } } L1: fmt.Println("END") }
次回
Go言語の配列、スライス、マップについて学んでいきます。