リフレクションでのネストされた構造と参照渡し
Go では、ネストされた構造と、リフレクションでそれらを参照渡しする方法を理解することは、重要な。ネストされた Client 構造体と Contact 構造体があるシナリオを考えてみましょう。
<code class="go">type Client struct { Id int Age int PrimaryContact Contact Name string } type Contact struct { Id int ClientId int IsPrimary bool Email string }</code>
Client 構造体の PrimaryContact フィールドをイントロスペクトすると、「アドレス指定できない値を使用したreflect.Value.Set」パニックが発生する可能性があります。これは、PrimaryContact が参照ではなく値によって渡されるためです。この問題を解決するには、リフレクションを使用して PrimaryContact を参照によって渡す必要があります。
Value.Addr() を使用した解決策
コード:
<code class="go">package main import ( "fmt" "reflect" ) type Client struct { Id int Age int PrimaryContact Contact Name string } type Contact struct { Id int ClientId int IsPrimary bool Email string } func main() { client := Client{} v := reflect.ValueOf(&client) primaryContact := v.FieldByName("PrimaryContact").Addr() primaryContact.FieldByName("Id").SetInt(123) primaryContact.FieldByName("ClientId").SetInt(456) primaryContact.FieldByName("IsPrimary").SetBool(true) primaryContact.FieldByName("Email").SetString("example@example.com") fmt.Printf("%+v\n", client) }</code>
出力:
{Id:0 Age:0 PrimaryContact:{Id:123 ClientId:456 IsPrimary:true Email:example@example.com} Name:}
キーポイント:
以上がValue.Addr() を使用してリフレクションでネストされた構造を参照によって渡す方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。