PC依存エンジニアのブログ

開発者向けにIT関連の情報をお届けしています。特にバックエンド開発者向けの内容が多めです。たまにフリーランス情報もお届けしています。

Go言語を学んでいく 第2弾:基本的なステートメント

第1弾ではGo言語の基礎的なところをやってきました。
iristech.hatenablog.com

今回はGo言語の基本的なステートメントについて学んでいきましょう。

ifステートメント

他の言語と同じように、シンプルに書くことができます。

package main

import (
    "fmt"
)

func main() {
    x := "rainy"

    if x == "sunny" {
        fmt.Println("Happy day.")
    }else if x == "cloudy" {
        fmt.Println("Not bad.")
    }else if x == "rainy" {
        fmt.Println("Bad day.")
    }
}

さらにGo言語では条件式の直前に実行する、簡易ステートメントを記述できます。
つまり x := "rainy"の部分を、if文の中に埋め込めます。

ただし変数はスコープはif文内のみとなりますので、外側では使用できません。

package main

import (
    "fmt"
)

func main() {
    if x := "rainy"; x == "sunny" {
        fmt.Println("Happy day.")
    } else if x == "cloudy" {
        fmt.Println("Not bad.")
    } else if x == "rainy" {
        fmt.Println("Bad day.")
    }

    // xはスコープ外になる
    // fmt.Println(x) ⇒ NG
}

switchステートメント

式switch

JavaC#と異なり、breakを記述せずとも、case節が終わると次のcase節に行かず、そのままswitch文は終了します。
もし次のcase節に行ってほしい場合は、fallthroughステートメントを使用します。

package main

import (
    "fmt"
)

func main() {
    x := "rainy"

    switch x {
    case "sunny":
        fmt.Println("Happy day.")
    case "cloudy":
        fmt.Println("Not bad.")
    case "rainy":
        fallthrough
    default:
        fmt.Println("Bad day.")
    }
}


こちらもif文同様に、簡易ステートメントを記述することが可能です。

package main

import (
    "fmt"
)

func main() {
    switch x := "rainy"; x {
    case "sunny":
        fmt.Println("Happy day.")
    case "cloudy":
        fmt.Println("Not bad.")
    case "rainy":
        fallthrough
    default:
        fmt.Println("Bad day.")
    }
}


またswitch式が空の場合は、trueと記述した場合と同じ扱いになります。

package main

import (
    "fmt"
)

func main() {
    x := "rainy"

    switch {
    case x == "sunny":
        fmt.Println("Happy day.")
    case x == "cloudy":
        fmt.Println("Not bad.")
    case x == "rainy":
        fallthrough
    default:
        fmt.Println("Bad day.")
    }
}

型switch

式switchでは値の比較を行っていました。
型switchでは型の比較を行って、条件分岐していきます。

package main

import (
    "fmt"
)

func main() {
    var x interface{} = "rainy"

    switch x.(type) {
    case nil:
        fmt.Println("This is nil.")
    case int:
        fmt.Println("This is int.")
    case string:
        fmt.Println("This is string.")
    default:
        fmt.Println("Other type.")
    }
}


※インターフェースに関しては、第5回で解説します。

forステートメント

forステートメントに関しては、他言語とそこまで違いはありません。

package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }
}


条件部分以外は省略可能なので、以下のように書き換えることもできます。

package main

import (
    "fmt"
)

func main() {
    i := 0

    for i < 10 {
        fmt.Println(i)
        i += 1
    }
}


続いて

を見てみましょう。

package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 10; i++ {
        if i == 6 {
            break
        }

        if i%2 == 1 {
            continue
        }

        fmt.Println(i)
    }
}


ちなみに他言語にあるwhileやuntilなどは、forステートメントで記載できるので、Go言語に存在しません。

gotoステートメント

そこまで頻出するステートメントではありませんが、覚えておいた方がいいgotoステートメント
gotoステートメントは指定したラベルへジャンプすることができます。

下記の例ではラベルL1にジャンプしています。

package main

import (
    "fmt"
)

func main() {
    weather := "sunny"

    if weather == "sunny" {
        goto L1
    }

    fmt.Println("bad weather but ")

L1:
    fmt.Println("happy days")

}


gotoで使えるのは2重ループの時などで、ループを脱出したいときです。
breakステートメントは、最も近いループの脱出しかできないため、2重ループの場合、2回breakを書かなければなりません。

package main

import (
    "fmt"
)

func main() {
    doBreak := false
    for i := 0; i < 10; i++ {
        for j := 10; j > 0; j-- {
            if i == j {
                doBreak = true
                break
            }
        fmt.Println(i, j)
        }

        if doBreak {
            break
        }
    }

    fmt.Println("END")
}


対してgotoだと簡単に脱出できます。
余計なdoBreak変数も使わずに済みます。

package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 10; i++ {
        for j := 10; j > 0; j-- {
            if i == j {
                goto L1
            }
            fmt.Println(i, j)
        }
    }

L1:
    fmt.Println("END")
}

補足

ステートメントはまだまだ他にもあります。
今回は基本的なところのみですが、もっと詳しく知りたい方は、Go言語の公式ドキュメントを参照してください。
golang.org


次回

Go言語の配列、スライス、マップについて学んでいきます。