Go では、個別の状態を維持するためにインターフェイス値のコピーを作成する必要があるシナリオに遭遇することがあります。ポインター参照を保持するインターフェイス値をコピーするときは、その影響を考慮することが重要です。この記事では、このようなシナリオの処理方法を検討し、真のコピーを作成するテクニックを紹介します。
指定された例では、user1 はポインターを介して Admin 構造体を参照します。これは、user1 を user2 に割り当てると、基本的に user2 が同じ基礎となる Admin 構造体を指すことになることを意味します。 user1 または user2 のいずれかを介して行われた変更は、元の構造体に影響します。
個別のコピーを作成する 1 つの方法は、user1 の値をアサートし、copy することです。基礎となる Admin 構造体を作成し、そのアドレスを新しい User 値でラップします:
var user2 User padmin := user1.(*Admin) // Obtain *Admin pointer admin2 := *padmin // Make a copy of the Admin struct user2 = &admin2 // Wrap its address in another User
より一般的な解決策として、Go のリフレクション機能を利用して基になる型を取得し、その型の新しい値を動的に作成して、それを新しい User 値でラップすることができます:
if reflect.TypeOf(user1).Kind() == reflect.Ptr { // Pointer: user3 = reflect.New(reflect.ValueOf(user1).Elem().Type()).Interface().(User) } else { // Not pointer: user3 = reflect.New(reflect.TypeOf(user1)).Elem().Interface().(User) }
リフレクションを使用すると、user1 の値がpointer.
インターフェイス値をコピーして区別しておく必要がある場合は、基礎となる型を慎重に検討し、明示的なコピーやリフレクションなどの適切な手法を使用して真のコピーを作成することが重要です。 。これらのアプローチにより、元のコピーに影響を与えることなく 1 つのコピーを変更できます。
以上がポインター参照を扱うときに Go でインターフェイス値の真のコピーを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。