はじめに
Go言語はシンプルで明示的なコードという点を非常に重要視している言語であると言えます。
言語の方向性の違いという面でPython
やRuby
に比べて書きにくいと感じてしまう事が多々ある人も少ないくない事でしょう。
本記事では一般的にGo言語で「デメリットと言われている点」について深掘りして話をできればと思います。
一般的に言われるデメリット
- 例外処理がない
- 三項演算子がない
- 継承ができない
- 関数オーバーロードがない
- 演算子オーバーロードがない
以下ではこれらについて解説します。
例外処理がない
例外処理とは?
例外処理とは、プログラムの実行中に発生する予期せぬエラーや異常な状況を処理する仕組みです。多くのプログラミング言語では、try
、catch
、finally
などのキーワードを使用してエラーをキャッチし、適切に対処します。
デメリット(例外処理がないことでの)
- 冗長なコードが発生しやすい
- ネストが深くなり、可読性が下がる場合がある
- すべてのエラーを明示的に処理しなければならないため、些細なエラーが冗長に扱われることがある
メリット(例外処理がないことでの)
- エラーを無視できない
- コードの可読性が向上
三項演算子がない
三項演算子とは?
三項演算子は、条件に基づいて値を選択する簡潔な方法です。多くの言語で condition ? valueIfTrue : valueIfFalse
の形で使用されます。
デメリット(三項演算子がない)
- コードが少し冗長になる
- 簡単な条件判断でも複数行が必要
メリット(三項演算子がない)
- コードの明確さ
- 複雑な条件判断が容易
継承ができない
継承とは?
継承は、あるクラスの特性と振る舞いを別のクラスが引き継ぐオブジェクト指向プログラミングの概念です。
デメリット
- 既存のコードの再利用が制限される
- オブジェクト指向プログラミングにおける典型的な継承パターンが使えない
- 共通のコード共有が複雑になる可能性がある
メリット
- クラス継承による深い階層が排除され、シンプルな設計を強制する
- 継承による複雑な依存関係を避けられる
関数オーバーロードがない
関数オーバーロードとは?
関数オーバーロードは、同じ名前で異なる引数の型や数を持つ関数を定義できる機能です。
Javaなどの場合は以下のようにオーバーロードができる
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
Goでは、関数オーバーロードの代わりに以下の方法を利用して柔軟な関数呼び出しを実現します
- 異なる名前の関数を使う
- 空インターフェース(interface{})を使う
- ジェネリクスを使う(Go 1.18以降)
- 可変長引数を使う
デメリット(関数オーバーロードがない)
- 同じ機能の関数に異なる名前をつける必要がある
メリット(関数オーバーロードがない)
- 型安全性
- コードの明確さ
演算子オーバーロードがない
演算子オーバーロードとは?
演算子オーバーロードは、ユーザー定義型に対して標準的な演算子(+, -, *など)の動作をカスタマイズする機能です。
デメリット(演算子オーバーロードがない)
- 柔軟性の欠如
- コードが冗長になる可能性
メリット(演算子オーバーロードがない)
- コードの明確さ
- 動作が予測可能(動作が保証される)
これらはデメリットではない
結局のところGoは以下の3点の理由があるため、他の言語と比べてこれらの問題があるのではないでしょうか?
- 明確さの追求:コードの意図を常に明示的に表現する
- シンプルさの重視:不必要な複雑さを排除する
- 一貫性の確保:予測可能で理解しやすいコードを書く
おわりに
他言語をベースにして考えていくとGoでは息苦しさを感じることもあるかも知れません。しかしながら、実際には堅牢で読みやすいコードを書くための洗練された設計であると言え、これはGoの良さであると考えています。
Goに入れば郷に従えってことですね。