概要
Go言語に対する長年の批判点を整理。 エラー変数のスコープやnilの扱いなど設計上の問題指摘。 移植性やリソース管理の難しさにも言及。 例外処理やUTF-8前提の文字列仕様の危険性を説明。 他の言語・実装との比較を通じてGoの課題を強調。
Go言語設計に対する批判点
- Go言語 の設計には、既存の知見を無視した 不合理な点 が多い。
- 過去記事 でも指摘した内容の繰り返しになるが、依然として根深い問題。
- 歴史的経験 があるにも関わらず、Goは安易な実装に終始した言語設計。
エラー変数のスコープ問題
- エラー変数(err) のスコープが 広すぎる ため、可読性と安全性が低下。
- if文内で スコープを限定 できても、関数全体で再利用される設計。
- errの再利用 がバグの温床になり、後のコードで誤って参照されるリスク。
- スコープ管理 がGoの構文上困難で、意図しないバグ誘発。
nilの二重性と混乱
- Goのnil には 2種類 あり、ポインタとインターフェースで挙動が異なる。
- 同じnil表示 でも、比較結果が一貫しない例が存在。
- 「What color is your nil?」 と揶揄される設計ミス。
- NULLの二重性 はバグや混乱の原因。
移植性の低さ
- 条件付きコンパイル のためにファイル冒頭にコメントを書く仕様。
- 移植性重視 の観点から見て、保守性を著しく損なう設計。
- 過去の経験 を無視した愚策であり、現場での運用に不向き。
appendの所有権不明問題
- append関数 の挙動が直感的でなく、 スライスの所有権 が不明確。
- 参照のままか、コピーが発生するか 予測困難。
- 意図しない結果 を招きやすく、言語仕様の不親切さを露呈。
deferによるリソース管理の曖昧さ
- deferによる解放 はRAIIのような自動リソース管理に劣る。
- JavaやPython のような構文的リソース管理がない。
- どのリソースでdeferが必要か 明示されておらず、手動管理の煩雑さ。
- 二重Close や例外時の安全性も保証されず、標準ライブラリでも例外を飲み込む設計。
例外(panic)と例外安全性の問題
- Goは例外(panic)を推奨しない が、例外安全なコードを書く必要がある。
- mutexのunlock など、panic発生時も安全に動作させる必要性。
- 標準ライブラリ でも例外(panic)を飲み込む場面があり、全ての開発者が例外安全を意識せざるを得ない。
- 例外のデメリットだけ が強調され、メリットは享受できない設計。
UTF-8前提の文字列仕様とデータ損失
- Goのstring型 はUTF-8前提で、 バイナリデータ を扱うとデータ損失の危険。
- UTF-8外のファイル名 やデータが黙ってスキップされる事例。
- 過去資産の互換性 を無視した設計で、データ消失のリスク。
メモリ使用量制御の難しさ
- GC(ガベージコレクション) の挙動が制御しづらく、 メモリ肥大化 が発生。
- クラウドやコンテナ 環境でのコスト増加や効率低下。
- runtime.GC() による手動制御は非推奨とされ、現場での対応が困難。
- 他言語への書き直し を余儀なくされるケース。
結論:既知の問題を無視した設計
- Goの設計上の問題 は、既に解決策が知られていたにも関わらず放置。
- COBOLやJavaの設計論争 とは異なり、歴史的知見を活かせなかった例。
- Goコードベース の維持管理が今後も大きな課題。