ゼロから学ぶGo言語プログラミング(4) コードフォーマット, コメント

一旦まっさらな所からGoを学びなおしている記事、4回目はコードフォーマットやコメントについて。

今回からは、以下のドキュメントを参照していきます。

このドキュメント、言語仕様やチュートリアルを読んでからと案内されていますが、内容を見る限り、ある程度はじめに目を通した方が良さそうです。

はじめに

GoにはGoのルールがあるから、既存の言語のコードをそのまま変換しても、良いGoのコードとはならないよ、という話。 当たり前なんですが、最初にわざわざこう釘を刺すのは、やはり独特な思想の言語だからでしょうか。

気になったのは以下の部分。

C++またはJavaプログラムをGo言語へ直接変換しても、あまりうまくは行きません。JavaのプログラムはあくまでJavaで書かれており、Go言語で書かれてはいないからです。

GoはC++とかJavaとか、これまで似た用途に使われてきた言語に似ていないんじゃないか、という印象があります。 どの言語もきっちり修めていない者の勝手な印象ですが、どちらかというとCに近くて、そこにpythonのようなスクリプト言語を足したような。 だからC++Javaのモダン版として取り組んでも駄目だよ、という事を言いたいような気がします。

まあ、C++Java含めて、そんなに既存の言語に染まれていない者にとっては、あまり悩む必要はない話ではあります。

ソースコードフォーマット

ソースコードの書き方は、どうしても個人の好みや組織のルールに差が生まれやすい。 そこでGoでは、なんとはじめからフォーマット用のツールを環境に同梱している。

Go Playgroundにもgofmtは提供されていて、上部の「Format」ボタンでフォーマットしてくれます。

gofmtというこのフォーマットツールを使えば、関わるコードはどれも同じフォーマットに統一出来る。 もちろんツールがサポートしていない細かな差異は残るでしょうが、不毛な争いはぐっと減る。 この仕組、全ての言語が取り入れて良い気もします。

ただ、そこまで同じフォーマットにするのであれば、pythonみたいにもっとインデントや改行に依存した構文を採用しても良かったと思いますが、その気配は今のところありません。 言語を設計する上で、大きなデメリットがあるのかも知れません。

インデント

なんとタブ限定。 スペースは原則禁止です。

以前から自分用のコードはどの言語でもタブで統一してきたので、これは非常にありがたい。 Go Playgroundで試すと、スペースでインデントしていても、gofmtがタブに揃えます。

ブラウザの標準タブ文字幅が広い(スペース8つ分)のは気になりますが、playgroundであれば特に困らない。 問題はブラウザ上でGoの開発を行うような環境の場合で、タブ文字幅を指定する方法が無いと、拒否感強くなりそうです。

行の長さ

これも、特に制限しないということで、ありがたい。 一律に上限を定めるほうが、かえって分かりにくい場合もあります。

行があまりにも長くなったときは、改行してタブでインデントしてください。

とありますが、例えば引数名が長く多い場合など、改行してインデントすべきか、gofmtが面倒見てくれないケースも出てきそうです。 こういうケースの処理は、既存のライブラリを参照すれば良さそうです。

括弧

Go言語はあまり括弧を必要とはせず、制御機構(if, for, switch)の構文には括弧を使いません。

とりあえずGoにはif, for, switchがあることと、python同様括弧は不要、ということがわかりました。 pythonにはswitchなくて分かりにくく感じたこともあったので、これもありがたい。

演算子の部分は「見たとおりの」とありますが、ビットシフトが使い慣れずいまいちしっくりこない。 シフト演算子は、加算演算子より優先度が高いのが前提で、「見たとおりの」なんでしょうか。 これは後々、演算子の優先順位などを確認します。

コメント

コメントもシンプルです。 / / のブロックコメントと、// のラインコメントのみ。

コメントははじめからドキュメント用途を想定されているようです。 他の言語のxdocのように、Goにはgodocというドキュメント抽出用の仕組みがあり、この仕組みを意識したコメントを書くよう

godoc用のコメントも、非常にシンプル。 パッケージでも関数でも変数でも、宣言前に置いたコメントが、ドキュメントで使用されます。

次は引き続き、名前とセミコロン。