Go言語学習の2日目に入りました! 今日は 「関数(functions)」 と 「フロー制御(for, if/else, switch, defer)」 を学ぼうと思います。
ちょっとずつ、ちょっとずつ。。。
いきなりだと、3日坊主になるかもしれないので、地道に。。。
先日に引き続き、参考にしているのは、Go公式の学習コンテンツ A Tour of Goです。 文系SEにもやさしい説明が多くて、個人的にはかなり助かってます。
フロー制御はここから。 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で書くだけですよ。安心。