🗂
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)
}
Discussion