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 サイトの他の関連記事を参照してください。