Go でインターフェイスを操作する場合、すべてが値によって渡されることを理解することが重要です。インターフェースも例外ではありません。その結果、インターフェイス値を割り当てると、基になる (値; タイプ) ペアを含むその値のコピーが作成されます。これは、コピーに加えられた変更は元の変数には影響しないことを意味します。
インターフェイス変数のポインターの型と値を変更するには、変数のアドレスをリフレクション パッケージに渡す必要があります。これは、リフレクションが値に作用し、アドレスを渡すことでコピーではなく実際の変数を変更できるためです。
このアプローチを示すコードの修正バージョンを次に示します。
import ( "fmt" "reflect" ) type Greeter struct { Name string } func (g *Greeter) String() string { return "Hello, My name is " + g.Name } type Greeter2 struct { Name string } func (g *Greeter2) String() string { return "Hello2, My name is " + g.Name } func main() { var a fmt.Stringer a = &Greeter{"John"} fmt.Println(a.String()) // Hello, My name is John // Get the value of the pointer to variable 'a' v := reflect.ValueOf(&a).Elem() // Set the pointer to variable 'a' to point to a new Greeter2 struct v.Set(reflect.ValueOf(&Greeter2{"Jack"})) // Print the updated value of 'a' fmt.Println(a.String()) // Hello2, My name is Jack // Set a new value to 'a' a = &Greeter2{"Ron"} // Print the updated value of 'a' fmt.Println(a.String()) // Hello2, My name is Ron }
このコードでは、まずインターフェイス変数 'a' を作成し、それを Greeter 構造体で初期化します。次に、リフレクション パッケージを使用して「a」へのポインターの値を取得し、新しい Greeter2 構造体を指すように設定します。最後に、リフレクション操作後と、「a」を新しい値に直接設定した後の両方で、「a」の更新された値を出力します。
プログラムの出力は次のとおりです。
Hello, My name is John Hello2, My name is Jack Hello2, My name is Ron
これは、リフレクションを使用してインターフェイス変数 'a' のポインターの型と値を正常に変更したことを示しています。 *Greeter2 のみが fmt.Stringer を実装し、Greeter ではないため、この手法はポインター自体ではなく、ポイントされた値を変更する場合にのみ機能することに注意してください。
以上がGo でリフレクションを使用してインターフェイス変数のポインタの型と値を変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。