🐁

FEがGoやってみて感じた面白いとこ3選

2021/12/02に公開
  • FEがGoでTODOをLINEに定期投稿するBotを作ってみて、Go言語のここが面白い!と思ったところ3選くらい
  • やったやつのリポジトリ

:=

これで『宣言&右辺で型推論』ができる。数学記号としては『右辺で左辺を定義する』という意味。プログラミングにおける=は『右辺を左辺に代入する』なので、:=で『右辺から左辺の定義(≒変数の型推論)もする』という書き方、すごい納得感が高い。
『型推論しながら宣言であることも明示』がこんなシンプルにできるの、すごい好き。

Array.filterが言語標準装備じゃない

Goでは自前で描くかgo-funkなどのライブラリを使うことが多いらしい。Goはシンプルって聞いたことあるけど、そこまでシンプルなんだ…と思った。
汎用なfilteを用意すると『ブラックボックス内で無駄処理がされている』という可能性があるので『それぞれのユースケースにあわせて自分で好きなfilterを書いてね』ということなのかな…と勝手に解釈して納得してる。『Goははやい』の理由のひとつが『無駄処理を産んでしまう可能性を極力減らしている』ところにあるのかもしれない。

catchがない

jsでAPIコールするときはaxiosを使ってエラーはcatchすることが多いが、goはAPIコールでも関数の返却値を使う。
catch(例外)がない理由は 「例外」がないからGo言語はイケてないとかって言ってるヤツが本当にイケてない件 - Qiitaがとてもわかりやすい。

いろんなことに例外を使った結果として、「Javaの例外はまったく例外的なものではなくなってしまった」と。そして、どの「例外」がどれくらい深刻なものなのか(つまり、正常な状態に復帰させるべき例外はどれで、すぐさまシステムを停止させるべき例外はどれか)を見分けるのは(例外を起こした側ではなくて)関数の呼び出し側に丸投げされることになってしまった。

確かにthrowは『以後の処理をすべて強制終了してcatchまで戻る』という処理であるともいえるので、実装によっては『何段階すっとばしてやってきたのか』がわからなる可能性がある。それならば、GO言語のように関数のエラーは関数の返り値で、関数の終了直後にエラー返却を見て処理を書く、の方が『このエラーはこの関数から出てきたもの』が辿りやすい。納得。

おわりに Goをやってみて思ったこと

C, Java, Python, jsの経験がある状態で初見では『どの言語とあまり似てなくて独特』という印象だったが、やってみると書き方はかなりシンプルでわかりやすい。やったことある言語に比べて特に独特なのがエラー処理だが、それも『エラーはこうやって返却してこうやって受け取る』という型が1個理解できれば基本的なものはなんとなく書いていけそうだな、と感じた。
言語の思想・信条がかなりハッキリしており、やってみてなんでこんな書き方するんだGo言語!と思ったところは調べてみると、そういう思想もアリだな!と思えることが多いので、結構楽しい。たまには違う言語書きたいなって人には結構おすすめできる。

おまけ: 個人的なエラー処理の型

  • エラーを返したい時は返り値の1番最後にerrorという返り値を定義する
  • 正常の時はerrornil、逆に異常の時は他の返り値はnilでエラーに何か詰め込む
  • エラーがnilである判定を以って『正常終了』とする。nilでなければ『関数の異常終了』とする
func sampleFunction() (result, error) {
	result, err := function.someError()
	if err != nil {
		return nil, fmt.Errorf("Error: creaate line bot:", err)
	}
	return result, nil
}

Discussion