ブログ

/ 350 views

Go言語の言語仕様はシンプル

Go言語(Golang)は「シンプルさ」を設計思想の根本に置いており、覚えるべき文法や機能があえて最小限に絞り込まれています。実際、Go言語の予約語(キーワード)はわずか25個しかありません。

具体的に言語仕様として用意されている主な項目と、逆に「あえて用意されていない(削ぎ落とされた)項目」を整理してお伝えします。

1. 制御構文

制御構文は非常にシンプルに設計されています。

  • 繰り返しは for のみ:他の言語によくある whiledo-while は存在せず、すべてのループ処理を for 文のみで記述します。
  • 条件分岐ifswitch が用意されています。ただし、コードを複雑にする原因となる三項演算子(条件 ? 真 : 偽)は用意されていません

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言語は機能が少ないことをメリットとして活かす言語です。複雑なメタプログラミングや継承を排除し、用意されたシンプルな機能を組み合わせることで、誰が書いても読みやすく、メンテナンスしやすいコードになるように設計されています。