Go 言語における if 分岐文

GolangGolangBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

TODO プランを作成する際、タスクがまだ完了していなければTODOリストに追加され、完了していれば完了アイテムに移動されます。

プログラミングの世界でも、異なる要件に基づいてプログラムの方向を変更する必要があります。次に、フロー制御文である if 分岐文について学びましょう。

ポイント

  • if
  • if-else
  • else-if
  • 書式規則

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/BasicsGroup(["Basics"]) go(("Golang")) -.-> go/FunctionsandControlFlowGroup(["Functions and Control Flow"]) go(("Golang")) -.-> go/AdvancedTopicsGroup(["Advanced Topics"]) go/BasicsGroup -.-> go/values("Values") go/BasicsGroup -.-> go/variables("Variables") go/FunctionsandControlFlowGroup -.-> go/if_else("If Else") go/FunctionsandControlFlowGroup -.-> go/switch("Switch") go/AdvancedTopicsGroup -.-> go/time("Time") subgraph Lab Skills go/values -.-> lab-149071{{"Go 言語における if 分岐文"}} go/variables -.-> lab-149071{{"Go 言語における if 分岐文"}} go/if_else -.-> lab-149071{{"Go 言語における if 分岐文"}} go/switch -.-> lab-149071{{"Go 言語における if 分岐文"}} go/time -.-> lab-149071{{"Go 言語における if 分岐文"}} end

if文

最も一般的に使用される分岐文は if 文で、事前に設定された条件が真であるかどうかをチェックし、その後コードブロックを実行するかどうかを決定します。以下はその形式です。

if condition {
    コードブロック
}

条件が真の場合、プログラムはコードブロックを実行します。そうでなければ、コードブロックをスキップします。

実際の例を見てみましょう。if.go という新しいファイルを作成し、次のコードを記入します。

cd ~/project
touch if.go
package main

import (
    "fmt"
)

func main() {
    var num = 40
    // %を使って2つの数の割り算の余りを取得する
    if num % 2 == 0 {
        fmt.Println(num, "は偶数です")
    }
}

プログラムを実行します。

go run if.go

結果は以下の通りです。

40は偶数です

このプログラムでは、まず整数型の変数 num を宣言します。その後、if 文で剰余演算子 % を使って num を2で割った余りを取得し、等価演算子 == を使って余りが0に等しいかどうかをチェックします。もし等しければ、コードブロックが実行され、その数が偶数である旨が出力されます。

if else文

if 文の条件が満たされない場合に何か他のことを出力したい場合はどうすればよいでしょうか。この場合、if else 文を使用することができます。if 文の条件が真の場合、if 文のコードブロックが実行されます。そうでなければ、else 文のコードブロックが実行されます。

if else 文の形式は if 文と似ています。

if condition {
    コード
} else {
    コード
}

例を見てみましょう。以下のプログラムは、今日が平日か休日かを出力します。

cd ~/project
touch if_else.go
package main

import (
    "fmt"
    "time"
)

func main() {
    // 現在の時刻を取得する
    t := time.Now()

    // 土曜日または日曜日かどうかをチェックする
    if t.Weekday() == time.Saturday || t.Weekday() == time.Sunday {
        fmt.Println("今日は:", t.Weekday(), "休日")
    } else {
        fmt.Println("今日は:", t.Weekday(), "平日")
    }
}

プログラムを実行します。

go run if_else.go

結果は以下の通りです。

今日は: 月曜日 平日

標準ライブラリの time パッケージを使用して現在の時刻を取得します。その後、土曜日と日曜日と比較して、休日の場合、if 文のコードブロックが実行されます。そうでなければ、else 文のコードブロックが実行されます。

else if文

単一の条件をチェックするだけでなく、複数の条件をチェックするために else if 文を使用することもできます。

その形式は以下の通りです。

if condition {
    コード
} else if condition {
    コード
} else {
    コード
}

分岐文では、複数の else if 文を持つことができますが、if 文は1つだけ、else 文も1つだけです。else if 文は if 文と else 文の間に配置する必要があります。

「if else」のセクションのプログラムを更新して曜日を出力するようにしましょう。

if_else.go ファイルを更新します。

package main

import (
    "fmt"
    "time"
)

func main() {
    today := time.Now().Weekday()

    if today == time.Monday {
        fmt.Println("今日は月曜日です")
    } else if today == time.Tuesday {
        fmt.Println("今日は火曜日です")
    } else if today == time.Wednesday {
        fmt.Println("今日は水曜日です")
    } else if today == time.Thursday {
        fmt.Println("今日は木曜日です")
    } else if today == time.Friday {
        fmt.Println("今日は金曜日です")
    } else if today == time.Saturday {
        fmt.Println("今日は土曜日です")
    } else {
        fmt.Println("今日は日曜日です")
    }
}

プログラムを実行します。

go run if_else.go

実行後、結果は以下の通りです。

今日は月曜日です

以前のプログラムでは、まず time.Now() を使って現在の時刻を取得し、その後現在の時刻から曜日を取得していました。このプログラムでは、この2行のコードを1行にまとめています。曜日を取得した後、それを分岐文と照合して曜日を出力しています。

if文における初期化文

以前の学習では、if 文は1つのパラメータである条件のみを持っていました。

if condition {
    コード
}

完全なパラメータには初期化文も含まれており、これはGoにおけるオプショナルなパラメータです。主に一時的な変数の宣言と初期化に使用され、使用する際には初期化文はセミコロンで区切られます。構文は以下の通りです。

if 初期化文; 条件 {
    コード
}

「if else」のセクションのプログラムを書き換えました。コードを短縮するために、変数宣言を if 文に初期化文として移動しました。

package main

import (
    "fmt"
    "time"
)

func main() {
    if t := time.Now(); t.Weekday() == time.Saturday || t.Weekday() == time.Sunday {
        fmt.Println("今日は:", t.Weekday(), "休日で、勉強して充電します")
    } else {
        fmt.Println("今日は:", t.Weekday(), "また一生懸命勉強しています")
    }
}

プログラムを実行します。

go run if_else.go

正しく動作することがわかります。

今日は: 月曜日 また一生懸命勉強しています

注: 初期化文で宣言された変数のスコープは if ブロック内のみです。

フォーマットの問題

Go言語を学んでいる皆さんが、if文の際のGoのフォーマット要件にご注意いただいたかどうかはわかりません。

  • Goでは、キーワードの ifelseelse if は、右カッコ } と同じ行にある必要があります。
  • else ifelse のキーワードも、前の左カッコと同じ行にある必要があります。そうでなければ、コンパイル時にコンパイラが構文エラーを報告します。

else 文を次の行に移動した後にプログラムを実行すると、コンパイラが構文エラーを報告します。

まとめ

この実験では、if 分岐文について解説しました。主なポイントは以下の通りです。

  • if 分岐コードブロック内には、複数の else if 文があり得ますが、if 文は1つだけ、else 文も1つだけです。
  • else if 文は、if 文と else 文の間に配置する必要があります。
  • if 文で初期化文を使用することで、コードを短縮できます。
  • コンパイラは、キーワードの ifelseelse if がカッコと同じ行にあることを強制します。