3.2 構造体をインスタンス化する3つの方法

Goの構造体をインスタンス化するには3種類の方法があります。

  1. new()関数で作成

  2. var変数宣言

  3. 複合リテラル(composite literal)で作成

	// newで作成(あまり使わない)
	p1 := new(Person)

	// var変数宣言で作成
	var p2 Person

	// 複合リテラルで初期化
	p3 := &Person{
		FirstName: "三成",
		LastName:  "石田",
	}

生成される型がポインター型かどうか、初期値を与えられるかどうかの違いはありますが、どれを使っても間違いではありません。標準ライブラリでも、これらが利用されています。

表3-1: インスタンス作成

生成方法

生成される型

フィールドの初期値

new()

*Struct

ゼロ値のみ

var変数宣言

Struct

ゼロ値のみ

複合リテラル

&をつけると*Struct。つけないとStruct

初期値を設定できる

複合リテラルは、ネストした構造体でも利用できます。

複合リテラルによるインスタンス作成時に値を設定しなかったフィールドや、他の手法で初期化した時の各フィールドはゼロ値と呼ばれるもので初期化されます。ゼロ値は、数値であればゼロ、文字列であれば空文字列、ブール型であればfalse、ポインターであればnilです。

varを使った宣言には、ポインター型の宣言もあります。これはインスタンスのポインターを格納する変数であって、この変数宣言そのものではインスタンスは作成されません。初期値を与えない場合、nilが保存されます。

 // var変数宣言でも、ポインター型の場合は作成されない var ...