いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-202 (type alias と defined type の違い)

概要

結構、周りから違いが分からないと聞かれることが多いので、ここにメモメモ。。。

実際に見たほうがわかりやすいと思いますので、以下にサンプルを。

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の場合は、その名前の通り全く別の型として定義しますが、元の型で包んであげると変換可能。

って覚え方でいいと思います。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。