ホームページ > バックエンド開発 > Golang > Go のリフレクションを使用してインターフェイス変数のポインタ型と値の両方を変更できますか?

Go のリフレクションを使用してインターフェイス変数のポインタ型と値の両方を変更できますか?

DDD
リリース: 2024-11-28 16:48:24
オリジナル
920 人が閲覧しました

Can You Change Both Pointer Type and Value of an Interface Variable Using Reflection in Go?

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

Go の型システムでは、インターフェイスは、型が特定の動作を公開するために実装できるコントラクトを定義します。インターフェイス値を扱うときは、値の受け渡しとリフレクションがどのように作用するかを理解することが重要です。

値の受け渡し

Go では、インターフェイス値を含むすべての値が値によって渡されます。インターフェイス値を変数に割り当てるか、それを関数に渡すと、インターフェイス値のコピーが作成されます。このコピーには、基礎となる具体的な値とその値の型への参照が含まれています。

ポインタ値の変更

リフレクションを使用してインターフェイス変数のポインタ値を変更できると述べました:

v.Elem().Set(reflect.ValueOf(&Greeter{"Jack"}).Elem())
ログイン後にコピー

これが機能するのは、リフレクションによってインターフェイスに格納されている基になる値へのアクセスが提供されるためです。 v.Elem() を呼び出すと、具体的な値のリフレクション値が取得され、Set を使用して変更できます。

ポインタ型の変更

ただし、あなたの質問は、インターフェイス変数のポインタ型と値。残念ながら、これはあなたが説明した方法でリフレクションを使用して行うことはできません:

v.Elem().Set(reflect.ValueOf(&Greeter2{"Jack"}).Elem())
ログイン後にコピー

これを試みると、Go ではインターフェイスに異なる型の値を割り当てることができないため、パニック エラーが発生します。価値。具体的には、Go では、インターフェイスに割り当てられる値の型がインターフェイス自体の型と一致する必要があります。

ポインターを使用した解決策

インターフェイス変数のポインター型と値の両方を変更するには、最初に目的の型の変数を作成し、そのアドレスをリフレクション値に渡す必要があります。これにより、ポインターを介して変数に格納されている値を変更できます。

var newGreeter2 = &Greeter2{"Jack"}
reflect.ValueOf(&&a).Elem().Set(reflect.ValueOf(newGreeter2))
ログイン後にコピー

このアプローチを使用すると、インターフェイス変数の型と値の両方を効果的に変更できます。ただし、元の変数自体ではなく、インターフェイス値のコピーを引き続き使用していることに注意することが重要です。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート