ホームページ >バックエンド開発 >Golang >Value.Addr() を使用してリフレクションでネストされた構造を参照によって渡す方法?

Value.Addr() を使用してリフレクションでネストされた構造を参照によって渡す方法?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-24 03:34:02757ブラウズ

How to Pass Nested Structures By Reference in Reflection Using Value.Addr()?

リフレクションでのネストされた構造と参照渡し

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() を使用した解決策

  1. にポインタを渡します。クライアント構造体: リフレクションを使用して構造体のフィールド値を設定するには、それをポインターとして渡す必要があります。この場合、&client は Client 構造体へのポインタです。
  2. PrimaryContact フィールドのポインタ値を取得します: Value.Addr() を使用して、PrimaryContact フィールドのポインタ値を取得します。このアドレス可能な値は、ネストされた構造体のフィールド値を設定するために使用できます。

コード:

<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:}

キーポイント:

  • ネストされた構造体を参照によって渡すには、reflect.Value.Addr().
  • を使用します。 Reflect.Value.SetInt()、reflect.Value.SetString() などを使用してフィールド値を設定します。
  • 構造体フィールドを反復処理して、すべてのネストされた構造体の値を設定します。

以上がValue.Addr() を使用してリフレクションでネストされた構造を参照によって渡す方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。