Go言語(Golang)は「シンプルさ」を設計思想の根本に置いており、覚えるべき文法や機能があえて最小限に絞り込まれています。実際、Go言語の予約語(キーワード)はわずか25個しかありません。
具体的に言語仕様として用意されている主な項目と、逆に「あえて用意されていない(削ぎ落とされた)項目」を整理してお伝えします。
1. 制御構文
制御構文は非常にシンプルに設計されています。
- 繰り返しは for のみ:他の言語によくある
whileやdo-whileは存在せず、すべてのループ処理をfor文のみで記述します。 - 条件分岐:
ifとswitchが用意されています。ただし、コードを複雑にする原因となる三項演算子(条件 ? 真 : 偽)は用意されていません。
2. データ構造と型
基本的なデータ構造が言語レベルで組み込まれています。
- 基本型:整数(
int,int64など)、浮動小数点(float32,float64)、真偽値(bool)、文字列(string)などが用意されています。 - 配列とスライス:固定長の「配列」に加え、動的にサイズを変更できる「スライス」という配列のようなデータ構造が標準で用意されています。
- マップ:キーと値のペアを保存するハッシュテーブル(連想配列)である
mapが組み込まれています。 - ポインタ:C言語のようにポインタ(メモリアドレス)を扱うことができますが、安全性を保つためにポインタ演算(アドレスへの加減算)は禁止されています。
3. オブジェクト指向の機能
Go言語には、JavaやC++のような「クラス(Class)」や「継承」という概念が存在しません。その代わりに以下の項目が用意されています。
- 構造体(struct):データとメソッドをまとめるための機能です。
- インターフェース(interface):振る舞い(メソッド)だけを定義します。Goは「ダックタイピング(構造的型付け)」を採用しており、ある構造体がインターフェースと同じメソッドを持っていれば、明示的な宣言なしにそのインターフェースを実装しているとみなされます。
4. 関数とエラー処理
- 複数の戻り値:関数から複数の値を同時に返すことができます。
- エラー処理:他の言語によくある
try-catchのような例外処理機構はありません。その代わり、関数が通常の戻り値と一緒に「エラーオブジェクト(error型)」を返し、呼び出し元でif err != nilのようにエラーチェックを行うのがGoの標準的な書き方です。 - 遅延実行(defer):関数が終了する直前に必ず実行したい処理(ファイルのクローズやメモリの解放など)を予約できる便利な構文です。
5. 並行処理(非同期処理)
Go最大の強みである並行処理も、言語の基本構文としてシンプルに組み込まれています。
- Goroutine(ゴルーチン):関数を呼び出す際に
goというキーワードをつけるだけで、非常に軽量なスレッドとして非同期実行できます。 - チャネル(channel):並行して動いているゴルーチン同士で、安全にデータを送受信するためのパイプのような仕組みです。
- select 文:複数のチャネルからのデータ受信を待ち受けるための専用構文です。
6. ジェネリクス(Generics)
長い間、Goには型を抽象化する「ジェネリクス」が存在しませんでしたが、バージョン1.18(2022年リリース)で導入されました。これにより、型に依存しない汎用的な関数やデータ構造を、シンプルかつ型安全に書けるようになっています。
--------------------------------------------------------------------------------
このように、Go言語は機能が少ないことをメリットとして活かす言語です。複雑なメタプログラミングや継承を排除し、用意されたシンプルな機能を組み合わせることで、誰が書いても読みやすく、メンテナンスしやすいコードになるように設計されています。