ホームページ  >  記事  >  バックエンド開発  >  Go でリフレクションを使用してインターフェイス変数のポインタの型と値を変更するにはどうすればよいですか?

Go でリフレクションを使用してインターフェイス変数のポインタの型と値を変更するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-17 11:05:02581ブラウズ

How can I change the pointer type and value of an interface variable using reflection in Go?

リフレクションを使用したインターフェイスでのポインタの型と値の変更

質問

どのようにポインタの型と値を変更できますか?リフレクションを使用したインターフェイスによって定義された変数?

Answer

Go では、インターフェイスを含め、すべてが値によって渡されます。インターフェイス値を割り当てる場合、コピーが作成され、変更の可能性が制限されます。

インターフェイス変数に格納されている値を変更するには、そのアドレスを使用する必要があります。 reflect.ValueOf(&varName).Elem() を通じて変数のアドレスにアクセスすると、新しいポインター値を変数に設定できます。

var a fmt.Stringer // Interface variable
a = &Greeter{"John"}

v := reflect.ValueOf(&a).Elem() // Access variable's address
v.Set(reflect.ValueOf(&Greeter2{"Jack"})) // Set new pointer value

fmt.Println(a.String()) // Hello2, My name is Jack (Greeter2.String() called)

重要なポイント

  • reflect.ValueOf(&varName) を使用してアドレスから開始します。
  • ポインタによって実装されたインターフェイスには設定できないため、ポインタ値をそれに設定します。

制限

  • Go の値渡しの性質のため、コピーを変更することは不可能です。ポインタを渡すことによってのみ、ポイントされた値を変更でき、変数の値を効果的に変更できます。
  • 変数の実際の型はコンパイル時に決定されるため、変数のインターフェイス型を変更することはできません。

以上がGo でリフレクションを使用してインターフェイス変数のポインタの型と値を変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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