コンテンツにスキップ

Go/core type

出典: フリー教科書『ウィキブックス(Wikibooks)』
< 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 がインターフェース型であり、以下のいずれかに該当する場合:

具体例

[編集]
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 typeint, 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 の代わりに、型パラメータの型セットがより重要な役割を果たすことになります。

参考文献

[編集]