Go言語学習2日目:関数と条件分岐・ループを学んでみた話。。(Go Tourで実践!)

Go言語学習の2日目に入りました! 今日は 「関数(functions)」 と 「フロー制御(for, if/else, switch, defer)」 を学ぼうと思います。

ちょっとずつ、ちょっとずつ。。。

いきなりだと、3日坊主になるかもしれないので、地道に。。。

先日に引き続き、参考にしているのは、Go公式の学習コンテンツ A Tour of Goです。 文系SEにもやさしい説明が多くて、個人的にはかなり助かってます。

kunio-ud-all.com

フロー制御はここから。 go.dev

(この記事は広告を含みます)

関数(functions)を覚える

Go言語では関数を func キーワードで定義!昨日覚えたShort variable declarationsも使ってみたり!

package main

import "fmt"

func sayHello() string {
    return "Hello, Go!"
}

func main() {
    message := sayHello()
    fmt.Println(message)
}

これが見ながらではなく、すらすら書けるようになると、いいな。

for文:Goのループはこれ1つでOK!

Goには while 文がなく、すべての繰り返し処理は for で書くというのが特徴のようです。

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

条件付きの for(いわゆるwhile的なやつ)も書けます。

func whileStyle() {
    i := 0
    for i < 3 {
        fmt.Println("i:", i)
        i++
    }
}

if/else 文を使ってみた

次は条件分岐。Goでは以下のように書きます。

func checkNumber(n int) string {
    if n > 0 {
        return "正の数です"
    } else if n < 0 {
        return "負の数です"
    } else {
        return "ゼロです"
    }
}

なんか、PythonとJSを足して2で割ったような感覚です。。。

switch文もシンプル!

近年、switch文は書かなくなってきましたが、、、

func judgeGrade(score int) string {
    switch {
    case score >= 90:
        return "A"
    case score >= 70:
        return "B"
    case score >= 50:
        return "C"
    default:
        return "D"
    }
}

Goの switch は break を書かなくても自動で抜けてくれるので、ミスが減ります。 また、switch文で条件式が使えるということは、複雑なif/elseのネスト地獄から逃れられそう。。かな。。。


defer:処理を「あとで」実行したいとき

本日は、これの理解に努めようと思います。defer

defer は一見地味だけど、「関数の最後に必ずやりたい処理」を指定できるのが便利!

func exampleDefer() {
    fmt.Println("start")
    defer fmt.Println("done")
    fmt.Println("doing something...")
}

出力順

start  
doing something...  
done

なかなか、、、使い道が多そうですね。パッと思いつくので、

  • メソッドのログ管理
  • メソッドの処理速度計測
  • ファイルのクローズ
  • 一時ファイルの削除
  • DBの接続終了
  • DBのトランザクション
  • 排他制御のアンロック

いいですね。実行時の下にdeferで書くだけですよ。安心。


本日のまとめ

Go言語2日目の学習ポイント
  • func を使って関数を定義できる
  • if/else、switch を使った条件分岐はシンプルでわかりやすい
  • すべてのループはforで対応可能
  • deferで「最後にやること」を指定できる便利な構文