Golang 制御文
if
基本
- 条件をかっこで囲む必要はない
- 三項演算子はサポートされていない
if x%2 == 0 { fmt.Println(x, "is even") }
変数の初期化
ifステートメント中に変数の初期化ができる。 スコープはifブロックの中だけになる。
if num := getnumber(); num < 0 { fmt.Println(num, "is negative") } else if num < 10 { fmt.Println(num, "has only one digit") } else { fmt.Println(num, "has multiple digits") }
switch
基本
Goではbreakが必要ない。
switch i { case 0: fmt.Print("zero...") case 1: fmt.Print("one...") case 2: fmt.Print("two...") default: fmt.Print("no match...") }
複数の式
switch city { case "Tokyo", "Kanagawa", "Chiba", "Saitama", "Tochigi", "Ibaraki": fmt.Print("Kanto") case "Aomori", "Akita", "Iwate", "Yamagata", "Miyagi", "Fukushima": fmt.Print("Tohoku") }
条件の省略
true値との比較に近い
switch { case r > 0.1: fmt.Println("Common case, 90% of the time") default: fmt.Println("10% of the time") }
forループ
基本
()が必要ない
for i := 1; i <= 100; i++ { sum += i }
条件、前後のステートメントは省略可能
while キーワードはないが、whileのような使い勝手となる。
for num != 5 { num = rand.Int63n(15) fmt.Println(num) }
for { if num = rand.Int63n(15);num == 5{ break } fmt.Println(num) }
defer 関数
defer ステートメントが含まれる関数が終了するまで、関数の実行が延期される
for i := 1; i <= 4; i++ { defer fmt.Println("deferred", -i) fmt.Println("regular", i) }
regular 1 regular 2 regular 3 regular 4 deferred -4 deferred -3 deferred -2 deferred -1
defer 関数の一般的なユース ケースは、ファイルの使用が終了したときにファイルを閉じること
func main() { f, err := os.Create("notes.txt") if err != nil { return } defer f.Close() if _, err = io.WriteString(f, "Learning Go!"); err != nil { return } f.Sync() }
panic 関数
プログラムを強制的にパニックにさせる。 Javaでいうthrow Exception
- すべての遅延関数呼び出しは、正常に実行される
- すべての関数から戻るまで、プロセスでスタックが続行される。
- その後、プログラムはログ メッセージを出力してクラッシュします。
panic("something went wrong")
recover 関数
recover() を使用すると、パニックの後で制御を取り戻すことができる 他の言語で言う、try/catch ブロックに近い
if r := recover(); r != nil { fmt.Println("Recovered", r) }