2.1 型を定義してデータの不整合を防止する

2.1.1 Goにおける型の定義

Goで型を定義するにはtypeキーワードと名前、その実体を並べます。実体は他の型を指定します。

// プリミティブ型
type SourceType int

// 構造体
type Person struct {
	Name string
	Age  int
}

intstringなどに対して「新しい名前と型」を与えます。このサンプルでは、intを元にSourceTypeを作っています。メモリ上のデータはintと同じく、64ビットOS上では8バイトのメモリを消費します。しかし、intの変数をSourceTypeにそのままは代入できませんし、その逆もできません。型が違うからです。Goではメモリのレイアウトやデータの実体が同じかどうかではなく、型によって代入できるかどうかが決まります。

これだけ見ると、あまりメリットがないように見えるかもしれませんし、元の型をそのまま使えば良いと思うかもしれませんが、次のようなメリットがあります。

  • intのようなプリミティブ型に対して型を作ると、列挙型を作るときに特定の要素のみを受け取ったり、他の列挙型やプリミティブ型と混ざることを防げる(間違えるとコンパイルエラーになる)

  • 構造体の場合、型の実体が長くなるので、コードが短くなる

  • 新しい型にはそれ固有のメソッドが定義できる

型によるエラーのチェックを強化するとともに、より大規模なアプリケーションを実装するための基礎となります。これから先の節でいくつもサンプルが登場しますので、今はピンと来なくても、これから読み進めると理解が深まるでしょう。

なお、Goの世界では型は 一級市民 ではありません。一級市民というのは、値として扱って変数に格納したりできることを意味します ...