付録

言語バージョン

Go 1互換性保証により、Go 1仕様に従って書かれたプログラムは、その仕様の寿命を通じて、変更なしに正しくコンパイルおよび実行され続けることが保証されています。より一般的には、言語に調整が加えられ、機能が追加されるにつれて、互換性保証により、特定のGo言語バージョンで動作するGoプログラムは、その後のバージョンでも引き続き動作することが保証されています。

例えば、2進整数リテラルに接頭辞0bを使用する機能は、整数リテラルのセクションに[Go 1.13]と示されているように、Go 1.13で導入されました。0b1011のような整数リテラルを含むソースコードは、コンパイラが使用する暗黙または必須の言語バージョンがGo 1.13より古い場合、拒否されます。

以下の表は、Go 1以降に導入された機能に必要な最小言語バージョンを示しています。

Go 1.9

  • エイリアス宣言を使用して型のエイリアス名を宣言できるようになりました。

Go 1.13

  • 整数リテラルは、2進数と8進数リテラルにそれぞれ接頭辞0b0B0o、および0Oを使用できるようになりました。
  • 16進数の浮動小数点リテラルは、接頭辞0x0Xを使用して記述できるようになりました。
  • 虚数接尾辞 iは、10進数リテラルだけでなく、任意の(2進数、10進数、16進数)整数または浮動小数点リテラルと共に使用できるようになりました。
  • 数値リテラルの桁はアンダースコア_を使用して区切る(グループ化する)ことができるようになりました。
  • シフト操作におけるシフトカウントは、符号付き整数型でもよくなりました。

Go 1.14

Go 1.17

  • スライスと配列の要素型が一致し、配列がスライスより長くない場合、スライスを配列ポインタに変換できるようになりました。
  • ビルトインパッケージunsafeに新しい関数AddSliceが追加されました。

Go 1.18

Go 1.18リリースでは、多相関数と型(「ジェネリクス」)が言語に追加されました。具体的には:

  • 演算子と句読点のセットに新しいトークン~が追加されました。
  • 関数と型の宣言で型パラメータを宣言できるようになりました。
  • インターフェース型は、(インターフェースの型名だけでなく)任意の型や、和集合、~T型要素を埋め込むことができるようになりました。
  • 事前宣言された型のセットに、新しい型anycomparableが追加されました。

Go 1.20

  • スライスと配列の要素型が一致し、配列がスライスより長くない場合、スライスを配列に変換できるようになりました。
  • ビルトインパッケージunsafeに新しい関数SliceDataString、およびStringDataが追加されました。
  • 型引数が厳密に比較可能でない場合でも、比較可能な型(通常のインターフェースなど)はcomparable制約を満たすことができるようになりました。

Go 1.21

  • 事前宣言された関数のセットに、新しい関数minmax、およびclearが追加されました。
  • 型推論はインターフェースメソッドの型を推論に使用するようになりました。また、変数に割り当てられたジェネリック関数や、他の(場合によってはジェネリックな)関数に引数として渡されたジェネリック関数の型引数も推論するようになりました。

Go 1.22

  • “for"文では、各イテレーションが同じ変数を共有するのではなく、独自のイテレーション変数セットを持つようになりました。
  • “range"節を持つ"for"文は、ゼロから上限までの整数値を反復処理できるようになりました。

Go 1.23

  • “range"節を持つ"for"文は、range式としてイテレータ関数を受け入れるようになりました。

Go 1.24

型の統一規則

型の統一規則は、2つの型が統一されるかどうか、およびその方法を記述します。正確な詳細はGo実装に関連し、エラーメッセージの詳細(コンパイラが型推論エラーまたは他のエラーを報告するかどうかなど)に影響し、通常とは異なるコード状況で型推論が失敗する理由を説明するかもしれません。しかし、概してこれらの規則はGoコードを書く際に無視できます:型推論は主に「期待通りに動作する」ように設計されており、統一規則はそれに応じて微調整されています。

型の統一はマッチングモードによって制御され、これは厳密または緩やかのいずれかです。統一が複合型構造を再帰的に降下する際、型の要素に使用されるマッチングモード(要素マッチングモード)は、2つの型が代入可能性≡ₐ)のために統一される場合を除いて、マッチングモードと同じままです:この場合、マッチングモードは最上位では緩やかですが、要素型では厳密に変わります。これは、型が代入可能であるために同一である必要がないという事実を反映しています。

バインドされていない型パラメータではない2つの型は、次の条件のいずれかが真である場合に厳密に統一されます:

  • 両方の型が同一である。
  • 両方の型が同一の構造を持ち、その要素型が厳密に統一される。
  • 正確に1つの型がバインドされていない型パラメータであり、その型セット内のすべての型が≡ₐの統一規則(最上位では緩やかな統一、要素型では厳密な統一)に従って他の型と統一される。

両方の型がバインドされた型パラメータである場合、それらは与えられたマッチングモードに従って統一されます。条件は:

  • 両方の型パラメータが同一である。
  • 型パラメータの最大1つが既知の型引数を持つ。この場合、型パラメータは結合されます:両方が同じ型引数を表します。どちらの型パラメータもまだ既知の型引数を持たない場合、一方の型パラメータに対して推論される将来の型引数は、両方に対して同時に推論されます。
  • 両方の型パラメータが既知の型引数を持ち、型引数が与えられたマッチングモードに従って統一される。

単一のバインドされた型パラメータPと別の型Tは、与えられたマッチングモードに従って統一されます。条件は:

  • Pが既知の型引数を持たない。この場合、TPの型引数として推論されます。
  • Pが既知の型引数Aを持ち、ATが与えられたマッチングモードに従って統一され、次の条件のいずれかが真である:
    • ATの両方がインターフェース型である:この場合、ATの両方が定義された型でもある場合、それらは同一でなければなりません。そうでなく、どちらも定義された型でない場合、同じ数のメソッドを持たなければなりません(ATの統一によって、メソッドが一致することはすでに確認されています)。
    • ATもインターフェース型ではない:この場合、Tが定義された型であれば、TPの推論された型引数としてAを置き換えます。

最後に、バインドされた型パラメータではない2つの型は、次の条件のいずれかが真である場合、緩やかに(そして要素マッチングモードに従って)統一されます:

  • 両方の型が厳密に統一される。
  • 一方の型が定義された型であり、もう一方の型が型リテラルであるが、インターフェースではなく、それらの基底型が要素マッチングモードに従って統一される。
  • 両方の型がインターフェース(ただし型パラメータではない)であり、同一の型項を持ち、両方とも事前宣言された型comparableを埋め込むか、両方とも埋め込まず、対応するメソッド型が厳密に統一され、一方のインターフェースのメソッドセットがもう一方のインターフェースのメソッドセットの部分集合である。
  • 一方の型のみがインターフェース(ただし型パラメータではない)であり、2つの型の対応するメソッドが要素マッチングモードに従って統一され、インターフェースのメソッドセットがもう一方の型のメソッドセットの部分集合である。
  • 両方の型が同じ構造を持ち、それらの要素型が要素マッチングモードに従って統一される。