Go言語におけるエイリアス型を使ったパターン

September 19, 2013

この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。

型のエイリアス

Go言語では、ある型に別名をつけ、別の型として使うことができる。 もちろん、組込み型へのエイリアス型を作ることもできる。

http://play.golang.org/p/wm5sWaa1J7

package main

import "fmt"

type Int int

func main() {
	n := 100
	m := Int(n) // キャスト
	fmt.Printf("%T, %T", n, m)
}

メソッドの実装

別名をつけた新しい型には、別途メソッドを設ける事ができる。 組込み型にメソッドを設けたい場合は便利である。

package main

import "fmt"

type Hex int

func (h Hex) String() string {
	return fmt.Sprintf("%#x", int(h))
}

func main() {
	fmt.Println(Hex(100))
}

用途や単位としての型

単位が違う場合や用途が違う場合、同じ値でも同じように扱うことを避けたい場合がある。その場合は、共通型に別のエイリアスを付けることで、区別することができる。

http://play.golang.org/p/AIai9zuemn

package main

import "fmt"

type Meter int
type Kilogram int

type Person struct {
	Name   string
	Height Meter
	Weight Kilogram
}

type Female *Person
type Male *Person

func femaleOnly(f Female) {
	fmt.Println(f.Name, "is a female.")
}

func main() {
	yamada := &Person{"Yamada", Meter(172), Kilogram(60)}
	fmt.Println(yamada)

	femaleOnly(Female(yamada))

}