Open3

実務でGoを書くようになりGoを好きになった話

koheiyamayamakoheiyamayama

テンプレートコードをたくさん書かないといけない

Goにまつわる噂でテンプレートコードをたくさん書かないといけないと聞いたことがあります。
Railsではその辺りがいい感じになっているので、まぁ似たようなコードは多いけど、テンプレートコードを書くことはそんなにない印象でした。
Goはテンプレートコードを書きまくる必要があると聞いていたので、Goを書く前は「そんなんでソフトウェアの本質的なところに集中できるのかな?」とか思ってました。
mercariはテンプレートコードは自動生成できるように整えていると聞いたけれと、それはmercariだからできることなんじゃないの?とか思ってました。

が、そうではなくてGoにはgo generateなど便利な機能があり、Railsとは違うやり方でテンプレートコードを書かずに済みます。

また、reflectなどを使えばメタプログラミングが可能であり(恩恵には預かってますが、実装したことはまだない)、かなり楽に、直感的(?)にコードを書くことができます。

なので、Goはテンプレートコードをたくさん書かないといけないって言うのは私の中で覆りつつあります。

もちろん、いちいちnilを確認するコードが多いのはそうなんですけど、まぁそこはそんなに大変じゃない、むしろ、コードが分かりやすくてこれはこれでいいなと思いました。

koheiyamayamakoheiyamayama

OSなどに依存しない実装ができる。
個人的に「これはすごいいい!」と思ったのはtimeパッケージのFixedZone関数。
これを使うと、引数にタイムゾーンに関するデータを入れることで、アプリケーションコード(OSなどに依存しない)いい感じにタイムゾーンを設定できる。

他にもTLSが独自実装とかそういう話も聞いたことがあり、便利だなと感じる。

アプリケーションコードで完結することのメリットは例えば、docker使っていてimageを更新した時に何か設定が変わったとしても、アプリケーションに影響を及ばさないことができる。
タイムゾーンとかはその典型例。環境変数を使えよ!っていう話もあるんだが。

koheiyamayamakoheiyamayama

何もない。それがいい。

それが良いは言いすぎですが、何もなくても大規模なシステムは作れるなと思いました。

最初の言語としてRubyを選び、後にTSやElixirを触った人として標準のデータ構造(sliceやmapなど)に対して操作する関数がないっていうのを聞いて「絶対にGoはめんどくさいでしょ」って思ってました。
最近は「mapがない?そのくらい自分で実装すればよくね?」「for文でappenすればよくね?」ってなりました。あったら便利ではありますが、Rubyみたいにたくさんのメソッドが用意されていると、それらを把握していないと初見でよくわからないコードになってしまいます。
であれば、for文を駆使ししてGoの基本的な文法がわかれば、誰でも分かるコードになっている方が良いのかも?と思うようになりました。

また、アプリケーションサーバを開発する時にフレームワークがないと聞いて、「俺にできるのだろうか、、?」と思っていましたが、その辺りはGo自身がサポートしていて、ライブラリを使わずに実装できる&ライブラリも標準パッケージに従っているので、いい感じです。

ORMみたいなものはあっても上手く使えてなかったので、なくても良いのかもしれないです。