Go 1.25での変更

今後のGo 1.25リリース(2025年8月)では、必要に応じて明示的な(そして同等の!)記述に代えて、言語仕様からcore typeの概念を削除することにしました。これには複数の利点があります:

  • Go仕様がより少ない概念を提示するため、言語を学習しやすくなります。
  • 非ジェネリックコードの動作は、ジェネリクス概念を参照することなく理解できます。
  • 個別化されたアプローチ(特定の操作に対する特定のルール)は、より柔軟なルールへの扉を開きます。すでにissue #48522について言及しましたが、より強力なスライス操作や改善された型推論のアイデアもあります。

関連する提案issue #70128は最近承認され、関連する変更はすでに実装されています。具体的には、言語仕様の多くの記述が元のジェネリクス以前の形式に戻され、ジェネリック操作数に関連するルールを説明するために必要に応じて新しい段落が追加されました。重要なことは、動作は変更されていないことです。core typeに関する全セクションが削除されました。コンパイラのエラーメッセージは「core type」について言及しないように更新され、多くの場合、エラーメッセージは型セット内のどの型が問題を引き起こしているかを正確に指摘することにより、より具体的になりました。

以下は、行われた変更のサンプルです。組み込み関数closeについて、Go 1.18以降、仕様は以下のように始まっていました:

チャンネルであるcore typeを持つ引数chに対して、組み込み関数closeはそのチャンネルでもう値が送信されないことを記録します。

closeがどのように動作するかを知りたい読者は、まずcore typeについて学ぶ必要がありました。Go 1.25以降、このセクションはGo 1.18以前と同じように始まります:

チャンネルchに対して、組み込み関数close(ch)はそのチャンネルでもう値が送信されないことを記録します。

これはより短く、理解しやすいです。読者がジェネリック操作数を扱う場合にのみ、新しく追加された段落を考慮する必要があります:

closeへの引数の型が型パラメータである場合、その型セット内のすべての型は同じ要素型を持つチャンネルでなければなりません。それらのチャンネルのいずれかが受信専用チャンネルである場合、エラーです。

core typeに言及していた各場所に同様の変更を行いました。要約すると、この仕様更新は現在のGoプログラムに影響を与えませんが、今日の言語をより学習しやすくし、その仕様をよりシンプルにしながら、将来の言語改善への扉を開きます。