🎃

Go言語で、if、switchを使う

2023/06/27に公開

ループ処理と条件分岐について学んでみた

前回は変数を学び直してみました。今度は、for文とif文をやってみたいと思います。for文、if文、switch文ってプログラミングの基本ですからね💦
公式の解説を翻訳して記載してます

for文を使う

forはGoの唯一のループ構文です。ここでは、基本的なforループの種類をいくつか紹介します。

最も基本的な型であり、単一の条件を持つ。

古典的な初期/条件/後のforループ。

条件なしのforは、ループを抜けるか、囲んでいる関数から戻るまで繰り返しループします。

ループの次の繰り返しに進むこともできる。

package main

import "fmt"

func main() {
    // 1~3までのループ
    i := 1
    for i <= 3 {
        fmt.Println(i)
        i = i + 1
    }
    // 7~9までのループ
    for j := 7; j <= 9; j++ {
        fmt.Println(j)
    }
    // breakを使用して、ループを抜ける
    for {
        fmt.Println("loop")
        break
    }
    // continueを使用して、次のループに進む
    for n := 0; n <= 5; n++ {
			// 偶数の場合は、次のループに進む
        if n%2 == 0 {
            continue
        }
        fmt.Println(n)
    }
}

実行結果

1
2
3
7
8
9
loop
1
3
5

if文を使う

Goのifとelseを使った分岐は簡単だ。

これが基本的な例だ。

elseがなくてもif文は書ける。

このステートメントで宣言された変数は、現在の分岐とそれに続くすべての分岐で使用できます。

Goでは条件を括弧で囲む必要はないが、中括弧は必要であることに注意。

Goには3項演算子がないので、基本的な条件であっても完全なif文を使う必要がある。

package main

import "fmt"

func main() {
    // 7%2は7を2で割った余りを返す
    if 7%2 == 0 {
        fmt.Println("7 is even")
    } else {
        fmt.Println("7 is odd")
    }
    // 8%4は8を4で割った余りを返す
    if 8%4 == 0 {
        fmt.Println("8 is divisible by 4")
    }
    // ここでnumが宣言されているが、if文の外では使えない
		// :=9はnum=9と同じ意味。
		// if num := 9; num < 0はnumが0より小さい場合にtrueを返す
    if num := 9; num < 0 {
        fmt.Println(num, "is negative")
    } else if num < 10 {
        fmt.Println(num, "has 1 digit")
    } else {
        fmt.Println(num, "has multiple digits")
    }
}

実行結果

7 is odd
8 is divisible by 4
9 has 1 digit

switch文を使う

Switch文は、多くの分岐にまたがる条件文を表現する。

これが基本的なスイッチだ。

同じcase文の中で複数の式を区切るにはカンマを使う。この例でも、オプションのデフォルトのcaseを使用します。

式を使わないswitchは、if/elseロジックを表現する別の方法である。ここでは、case式がどのように非定数になり得るかも示す。

型スイッチは、値の代わりに型を比較する。これを使えば、インターフェイスの値の型を知ることができる。この例では、変数tはその節に対応する型を持つ。

package main
// timeは、日付や時間を扱うための機能を提供するパッケージ
import (
    "fmt"
    "time"
)

func main() {
    // i := 2は、i = 2と同じ
    i := 2
    fmt.Print("Write ", i, " as ")
		// switch文は、if-elseの連続を簡潔に記述するための構文
		// switch文を使って、1,2,3のいずれかに対するcaseを記述
    switch i {
    case 1:
        fmt.Println("one")
    case 2:
        fmt.Println("two")
    case 3:
        fmt.Println("three")
    }
    // 1つのcaseで複数の式をカンマで区切って記述することもできる
		// time.Now().Weekday()は、現在の曜日を返す
    switch time.Now().Weekday() {
    case time.Saturday, time.Sunday:
        fmt.Println("It's the weekend")
    default:
        fmt.Println("It's a weekday")
    }
    // t := time.Now()は、現在の日付と時刻を取得
    t := time.Now()
    switch {
			// t.Hour()は、現在の時刻の「時」を返す
    case t.Hour() < 12:
        fmt.Println("It's before noon")
    default:
        fmt.Println("It's after noon")
    }
    // whatAmI := func(i interface{})は、関数を変数に代入
		// interface{}は、任意の型の値を受け取ることができる特殊な型
    whatAmI := func(i interface{}) {
        switch t := i.(type) {
        case bool:
            fmt.Println("I'm a bool")
        case int:
            fmt.Println("I'm an int")
        default:
            fmt.Printf("Don't know type %T\n", t)
        }
    }
		// whatAmI(true)は、関数を呼び出す
    whatAmI(true)
    whatAmI(1)
    whatAmI("hey")
}

実行結果

Write 2 as two
It's a weekday
It's after noon
I'm a bool
I'm an int
Don't know type string

最後に

昔やってみたときは、if文、for文、switch文は得意でなかったのですが、他の言語を勉強したら、Go言語自体は文法が簡単なので、以前よりは難しく感じませんでした。学習しやすい言語と言われている理由がわかった気がします。

Jboy王国メディア

Discussion