🗂

Golang 制御文

2021/07/10に公開

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

  1. すべての遅延関数呼び出しは、正常に実行される
  2. すべての関数から戻るまで、プロセスでスタックが続行される。
  3. その後、プログラムはログ メッセージを出力してクラッシュします。
panic("something went wrong")

recover 関数

recover() を使用すると、パニックの後で制御を取り戻すことができる
他の言語で言う、try/catch ブロックに近い

if r := recover(); r != nil {
    fmt.Println("Recovered", r)
}
GitHubで編集を提案

Discussion