Go/core type
表示
< Go
Goにおけるcore type(コア型)は、Go 1.18で導入されたジェネリクス(型パラメータ)に関連する概念でしたが、Go 1.25で削除される予定です。
Go 1.18からGo 1.24までの間、core typeは主に以下の目的で使用されていました。
- 型推論のサポート: ジェネリックな関数や型において、型パラメータの型を推論する際に役立っていました。
- 型制約の表現: 型制約(interface)の中で、型パラメータが持つべき共通の「基盤となる型」を示すために使用されました。これにより、例えば「この型パラメータは整数型である」といった制約をより柔軟に表現できました。
core typeの定義
[編集]Goの仕様書(Go 1.24時点)によると、ある型 T がcore typeを持つのは、以下のいずれかの条件を満たす場合です。
Tがインターフェース型でも型パラメータでもない場合、そのcore typeはT自身の underlying type です。Tがインターフェース型であり、以下のいずれかに該当する場合:Tを実装する全ての型の underlying type が同一である場合、その underlying type がTの core type です。Tの型セット(type set)内の全ての型が共通の underlying type を持つ場合、その underlying type がTの core type です。
具体例
[編集]type MyInt int type MyFloat float64 interface Integer { ~int | ~int8 | ~int16 | ~int32 | ~int64 // Go 1.18以降の型制約 } interface Number { Integer | float32 | float64 } func Print[T Number](val T) { println(val) } func main() { var i int = 10 var mi MyInt = 20 var f float64 = 3.14 Print(i) // Tはint, core typeはint Print(mi) // TはMyInt, core typeはint Print(f) // Tはfloat64, core typeはfloat64 }
上記の例では、Integer インターフェースの core type は存在しません。なぜなら、それを実装する可能性のある型の underlying type(int, int8, int16, int32, int64)が異なるからです。一方、Number インターフェースも同様に、Integer を含むため、core type は存在しません。
Go 1.25での削除
[編集]Go 1.25では、この core type の概念が仕様から削除される予定です。これは、core type がジェネリクスの理解を複雑にしているという認識と、より明確で柔軟な型制約の仕組みを導入するためです。
Go 1.25以降は、core type に依存したルールは、より直接的に型パラメータの型セットに基づいて定義されるようになります。
まとめ
[編集]Goにおける core type は、Go 1.18でジェネリクス導入時に、型推論や型制約をサポートするために導入された概念でしたが、Go 1.25で仕様から削除される予定です。これは、言語仕様の簡略化と、より直感的で強力なジェネリクスの実現を目的としています。Go 1.25以降は、core type の代わりに、型パラメータの型セットがより重要な役割を果たすことになります。