概要
結構、周りから違いが分からないと聞かれることが多いので、ここにメモメモ。。。
実際に見たほうがわかりやすいと思いますので、以下にサンプルを。
package types import ( "strings" "github.com/devlights/gomy/output" ) type typeAlias = string // stringの別名を定義(stringとしてそのまま利用可能) type definedType string // ベースが string の全く別の型を定義 (string(v)とすることで変換可能) // NG コンパイルエラー // invalid receiver type string (basic or unnamed type) // func (me aliasType) Upper() aliasType { // } // OK //lint:ignore U1000 ok func (me definedType) upper() string { return strings.ToUpper(string(me)) } // DiffTypeAliasAndDefinedType -- Goでの Type Alias と Defined Type の違いについてのサンプルです. // // 個人的に、Type Alias はほぼ使ったことがない。基本的に Defined Type で事足りている。 // // REFERENCES // - https://yourbasic.org/golang/type-alias/ // - https://budougumi0617.github.io/2020/02/01/go-named-type-and-type-alias/ // - https://text.baldanders.info/golang/go-1_9-and-type-alias/ func DiffTypeAliasAndDefinedType() error { var ( original string = "hello world" ) // ---------------------------------------------- // ベースとなる string の値を設定する場合の違い // ---------------------------------------------- // OK var alias typeAlias = original // NG // cannot use original (variable of type string) as definedType value in variable declaration // var defined definedType = original // OK var defined definedType = definedType(original) // ---------------------------------------------- // string の引数を要求する関数に渡す場合の違い // ---------------------------------------------- // OK show(alias) // NG // cannot use defined (variable of type definedType) as string value in argument to show // show(defined) // OK show(string(defined)) return nil } func show(v string) { output.Stdoutf("[v]", "%v (%T)\n", v, v) }
実行すると以下のような感じです。
$ make run go run -race main.go -onetime -example "" ENTER EXAMPLE NAME: alias [Name] "types_diff_typealias_and_definedtype" [v] hello world (string) [v] hello world (string) [Elapsed] 48.12µs
Aliasを付ける場合は、イコールを付けて型定義。単純に別名を与えているだけなので、元の形と全く同じように扱えます。
Defined Typeの場合は、その名前の通り全く別の型として定義しますが、元の型で包んであげると変換可能。
って覚え方でいいと思います。
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。