インスタンス化とは、構造体で定義されたフォーマットに従い、フォーマットに従ったメモリ領域を作成することであり、構造体インスタンスとインスタンス間のメモリは完全に独立しています。
Go 言語はさまざまな方法で構造をインスタンス化でき、実際のニーズに応じてさまざまな記述方法を選択できます。
基本的なインスタンス化されたフォーム
構造体自体は型であり、整数や文字列などの var の形式で構造体を宣言することでインスタンス化できます。
基本的なインスタンス化形式は次のとおりです。
var ins T
このうち、T は構造体の型、ins は構造体のインスタンスです。
構造体で表現される点構造体(Point)のインスタンス化処理については、以下のコードを参照してください。
type Point struct {
X int // X座標
Y int // Y座標
}
var p Point
p.X = 10
p.Y = 20
この例では、 .
を使用して、 pX
やpY
などの構造体のメンバー変数にアクセスします。構造体のメンバー変数の代入方法は、通常の変数の代入方法と同じです。
ポインタ型の構造体を作成する
Go 言語では、 new キーワードを使用して型 (構造体、整数、浮動小数点数、文字列などを含む) をインスタンス化することもでき、その構造体はインスタンス化後にポインター型構造体を形成します。
new を使用する場合の形式は次のとおりです。
ins := new(T)
の:
- T は型であり、構造体、整数、文字列などになります。
- ins: T 型はインスタンス化され、ins 変数に格納されます。ins の型は *T で、ポインターに属します。
Go 言語では、通常の構造体にアクセスするのと同じように、 .
を使用して構造体ポインターのメンバーにアクセスできます。
次の例では、プレーヤー (Player) 構造体を定義します。プレーヤーには名前、ライフ値、マジック値があります。プレーヤー (Player) 構造体をインスタンス化した後、メンバーに値を割り当てることができます。コードは次のとおりです:
type Player struct{
Name string
HealthPoint int
MagicPoint int
}
tank := new(Player)
tank.Name = "キャノン"
tank.HealthPoint = 300
new によってインスタンス化された構造体インスタンスのメンバー割り当ては、基本的なインスタンス化と一致します。
Go 言語と C/ C++
C/C++ 言語では、new を使用して型をインスタンス化した後、そのメンバー変数にアクセスするときに->
演算子を使用する必要があります。
Go 言語では、構造体ポインターのメンバー変数にアクセスするときに、引き続き.
を使用できます。これは、Go 言語では、開発者が構造体ポインターのメンバー変数にアクセスしやすくするために構文シュガー (Syntactic Sugar) テクノロジーを使用しているためです。 .Name 形式 (*ins).Name に変換されます。

Go 言語では、構造体に対して&
アドレス操作が実行されると、その型の新しいインスタンス化操作とみなされ、アドレスの形式は次のようになります。
ins := &T{}
の:
- T は構造体の種類を表します。
- ins は構造体のインスタンスで、型は *T (ポインター型) です。
以下は、この構造体を使用して、名前、変数の関連付け、コメントなどを含むコマンド ライン命令 (Command) を定義し、コマンドのポインター アドレスをインスタンス化し、割り当てプロセスを完了します。
type Command struct {
Name string // コマンド名
Var *int // コマンドにバインドされた変数
Comment string // コマンドのコメント
}
var version int = 1
cmd := &Command{}
cmd.Name = "version"
cmd.Var = &version
cmd.Comment = "バージョンを表示する"
コードの説明は次のとおりです。
- 行 1 は、コマンド ライン コマンドを表すコマンド構造を定義します。
- 行 3 (コマンドにバインドされた変数) は、整数ポインターを使用してポインターをバインドします。コマンドの値はいつでもバインドされた値と同期できます。
- 7 行目、コマンド バインディングのターゲット整数変数: バージョン番号。
- 9 行目、構造体のアドレスを取得してインスタンス化します。
- 10 行目から 12 行目では、メンバー フィールドを初期化します。
アドレスのインスタンス化は、構造体のインスタンス化で最も広く使用されている方法です。関数を使用して、上記の初期化プロセスをカプセル化できます。コードは次のとおりです:
func newCommand(name string, varref *int, comment string) *Command {
return &Command{
Name: name,
Var: varref,
Comment: comment,
}
}
cmd = newCommand(
"version",
&version,
"バージョンを表示する",
)