「キーと値のペア」を使用して構造を初期化します。
構造体は「キー値ペア」(キー値ペア)を使用してフィールドを初期化できます。各「キー」(キー)は構造体のフィールドに対応し、キー(値)の「値」はフィールドの値に対応します。初期化されるフィールド。
キーと値のペアの入力はオプションであり、初期化する必要のないフィールドは初期化リストに入力できません。
構造体がインスタンス化された後のフィールドのデフォルト値は、フィールド タイプのデフォルト値です。たとえば、値は 0、文字列は “” (空の文字列)、ブール値は false、ポインタは nil などです。
1) キーと値のペアの初期化構造体の記述形式
キーと値のペアの初期化の形式は次のとおりです。
ins := 構造体の型名{
フィールド 1: フィールド 1 の値,
フィールド 2: フィールド 2の値,
…
}
以下に各セクションの説明を示します。
- 構造体の型: 構造体を定義するときの型名。
- フィールド 1、フィールド 2: 構造体メンバーのフィールド名。構造体型名のフィールド初期化リストでは、フィールド名は 1 回だけ出現できます。
- フィールド 1 の値、フィールド 2 の値: 構造体のメンバー フィールドの初期値。
Key-Value は:
で区切られ、Key-Value ペアは,
2) 構造体にキーと値のペアを入力する例
次の例は、童謡「お父さんのお父さんはおじいちゃん」のとおり、家族内の登場人物間の関係を説明しています。複数レベルの子を使用して、登場人物間の関係を説明し、確立することができます。構造を埋めるためのコードキーと値のペアの形式は次のとおりです。
type People struct {
name string
child *People
}
relation := &People{
name: "MyName",
child: &People{
name: "MyChildName",
child: &People{
name: "MyChildChildName",
},
},
}
コードの説明は次のとおりです。
- 行 1 は People 構造を定義します。
- 行 2、構造体の文字列フィールド。
- 3 行目、構造体の構造体ポインター フィールド、タイプは *People です。
- 6 行目では、関係のアドレスが People タイプから取得された後、タイプ *People のインスタンスが形成されます。
- 8 行目では、child が初期化されるときに *People 型の値が必要で、そのアドレスを使用して People を初期化します。
ヒント: 構造体のポインター型のみを構造体のメンバーに含めることができ、非ポインター型を含めるとコンパイル エラーが発生します。
複数の値のリストを使用して構造体を初期化する
Go 言語は、「キーと値のペア」の初期化に基づいて「キー」を無視できます。つまり、構造体のフィールドを複数の値のリストで初期化できます。
1) 複数値リスト初期化構造体の記述形式
複数の値はカンマで初期化されます。例:
ins := 構造体型名{
フィールド 1 の値、
フィールド 2 の値、
…
}
この形式で初期化する場合は、次の点に注意する必要があります。
- 構造体のすべてのフィールドを初期化する必要があります。
- 各初期値の入力順序は、フィールドが構造体で宣言されている順序と一致している必要があります。
- キーと値のペアと値のリストの初期化形式を混合することはできません。
2) 複数の値のリストを使用して構造体を初期化する例
次の例はアドレス構造を示しており、アドレスには特定の順序が必要です。たとえば、次のとおりです。
type Address struct {
Province string
City string
ZipCode int
PhoneNumber string
}
addr := Address{
"Tokyo",
"Tokyo",
123456,
"123456789",
}
fmt.Println(addr)
コードを実行すると、出力は次のようになります。
{Tokyo Tokyo 123456 123456789}
匿名構造体には型名がなく、type キーワードで定義せずに直接使用できます。
1) 匿名構造体定義形式と初期化記述方法
匿名構造体の初期化は、構造体の定義とキーと値のペアの初期化の 2 つの部分で構成されます。構造体定義には構造体の型名はなく、フィールドと型の定義のみが含まれます。キーと値のペアの初期化部分は、複数のオプションのキーで構成されます。 -value ペア。次の形式です。
ins := struct {
// 匿名構造体フィールド定義
フィールド 1 フィールド タイプ 1
フィールド 2 フィールド タイプ 2
…
} {
// フィールド値の初期化 初期化
フィールド 1: フィールド 1 の値、
初期化フィールド 2: フィールド 2 の値,
…
}
以下に各セクションの説明を示します。
- フィールド 1、フィールド 2…: 構造体によって定義されたフィールド名。
- Initialize Field 1、Initialize Field 2…: 構造体が初期化されるときのフィールド名であり、フィールドは選択的に初期化できます。
- フィールド タイプ 1、フィールド タイプ 2…: 構造体はフィールドのタイプを定義します。
- フィールド 1 の値、フィールド 2 の値…: 構造体初期化フィールドの初期値。
キーと値のペアの初期化部分はオプションです。メンバーが初期化されていない場合、匿名構造体の形式は次のようになります。
ins := struct {
フィールド 1 フィールド タイプ 1
フィールド 2 フィールド タイプ 2
…
}
2) 匿名構造体の使用例
この例では、匿名構造体を使用してメッセージ構造体を定義および初期化します。このメッセージ構造体には、メッセージ識別部分 (ID) とデータ部分 (data) があります。メッセージの内容を出力する printMsg() 関数は、メッセージ構造体を受信する必要があります。匿名構造体パラメータの匿名構造体を再定義します。コードは次のとおりです。
package main
import (
"fmt"
)
// 匿名構造体を渡してメッセージの型をプリントする
func printMsgType(msg *struct {
id int
data string
}) {
fmt.Printf("%T\n", msg)
}
func main() {
// 匿名構造体のインスタンス化
msg := &struct { // 定義部分
id int
data string
}{ // 値の初期化部分
1024,
"hello",
}
printMsgType(msg)
}
コード出力は次のとおりです。
*struct { id int; data string }
コードの説明は次のとおりです。
- 8 行目では printMsgType() 関数を定義しており、パラメータは msg 、型は
*struct{id int data string}
で、型は type によって定義されていないため、使用するたびに定義する必要があります。 - 14 行目では、文字列フォーマットで
%T
動詞を使用して、msg の型名を出力します。 - 行 20 では、匿名構造体をインスタンス化し、そのメンバーを初期化します。
- 21 行目と 22 行目は、匿名構造体のフィールドを定義します。
- 24行目と25行目では匿名構造体のフィールドに初期値を代入しています。
- 28 行目で、関数呼び出しのために printMsgType() 関数に msg を渡します。
無名構造体の型名は、その構造体に含まれるフィールドメンバを詳細に記述したものであり、使用時に再定義する必要があり、繰り返しコードが多くなるため、開発で使用されることはほとんどありません。