Go/named type
Goにおけるnamed type (名前付き型) とは、型定義によって与えられた識別子 (名前) を持つ型のことを指します。Goの仕様書にある通り、「A named type is always different from any other type. (名前付き型は常に他のどの型とも異なる)」という重要な性質を持ちます。
具体例:
[編集]仕様書の例を参考にすると、以下の A0, A2, A3, A4, B0, B2, B4, C0, D0[int, string], E0 などはすべて名前付き型です。
type ( A0 = []string A1 = A0 A2 = struct{ a, b int } A3 = int A4 = func(A3, float64) *A0 A5 = func(x int, _ float64) *[]string B0 A0 B1 []string B2 struct{ a, b int } B3 struct{ a, c int } B4 func(int, float64) *B0 B5 func(x int, y float64) *A1 C0 = B0 D0[P1, P2 any] struct{ x P1; y P2 } E0 = D0[int, string] )
名前付き型の重要な性質:
[編集]上記の仕様書の抜粋にあるように、名前付き型は以下の点で重要です。
型の一意性: 名前付き型は、たとえその underlying type (基底型) が同じであっても、常に別の型として扱われます。例えば、B0 (A0の別名) と B1 ([]string) は underlying type が同じ []string ですが、B0 は名前付き型であるため、B1 とは異なる型です。同様に、func(int, float64) B0 と func(x int, y float64) *[]string も、B0 と []string が異なるため、異なる型となります。
- assignability (代入可能性): 値
xの型Vが型Tの変数に代入可能かどうかを判断する際、VとTが identical (同一) であるかどうかの条件の一つとなります。また、underlying type が同じでも、一方が名前付き型である場合、単純には代入できないことがあります。 - method sets (メソッドセット): 名前付き型
Tのメソッドセットは、レシーバー型がTであるメソッドの集まりです。ポインタ型Tのメソッドセットは、レシーバー型が*TまたはTであるメソッドの集まりです。名前付き型は、メソッドを定義するための基本的な構成要素となります。 - representability (表現可能性): 定数
xが型Tの値で表現可能かどうかを判断する際、Tが名前付き型であるかどうかが考慮されます。
対義語:
[編集]名前付き型に対する概念として unnamed type (無名型) または composite literal type (複合リテラル型) があります。これらは、型定義によって名前が与えられていない型であり、構造が同じであれば同じ型とみなされます。上記の例では、[]string や struct{ a, b int }, func(int, float64) *[]string などがこれに該当します。
まとめ:
[編集]Goにおける名前付き型は、型定義によって固有の名前を与えられた型であり、型システムにおいて一意性、代入可能性、メソッド定義など、様々な側面で重要な役割を果たします。同じ構造を持つ無名型とは明確に区別される点が、名前付き型の最も重要な特徴と言えるでしょう。