問題の歴史:
Goにおける型エイリアス(type alias)の登場は、APIのバージョン間でのスムーズな移行を確保する必要性に起因しています。Go 1.9以前は新しい型の宣言のみが使われており、現在では型エイリアスがサポートされています。
問題点:
多くの人がエイリアスと新しい型を混同し、同じものだと誤って考え、変換やメソッド、インターフェースへの渡し方でエラーを引き起こします。
解決策:
型エイリアスは既存の型に別名を付けますが、新しい型の宣言は既存のものを基にした新しいユニークな型を作成します。エイリアスは後方互換性を保持し、変換なしで古い型と新しい型を統合できます。
コード例:
// 新しい型 type MyString string // 型エイリアス type MyStringAlias = string
主な特徴:
エイリアスを通じて型にメソッドを追加できますか?
いいえ、メソッドは新しい型にのみ追加でき、エイリアスは新しい型ではなく、元の型と同じものです。
type Alias = int // func (a Alias) Method() {} // エラー!
エイリアスと新しい型の比較における違いは何ですか?
エイリアスは基本型と比較可能であり、変換なしでその値を受け取ります。新しい型はたとえ同じ型に基づいていても互換性がありません。
type T1 = int var a T1 = 10 // ok var b int = a // ok type T2 int var c T2 = 10 // var d int = c // コンパイルエラー
エイリアスが新しい型よりも優れているのはどのようなときですか?
パッケージ間での型の再エクスポートや、クライアントコードの再コンパイルなしでAPIの透明な移行を確保する必要があるときです。例えば:
type OldType = NewType // エイリアスは旧バージョンのAPIをサポートするのに便利
プロジェクトで新しい型を用いて型をリネームし、エイリアスではないため互換性が壊れます。
type OldType int
プラス面:
マイナス面:
型エイリアスを使用してAPIの透明な移行。
type OldType = NewType
プラス面:
マイナス面: