ホームページ > バックエンド開発 > Golang > ポインター参照を扱うときに Go でインターフェイス値の真のコピーを作成するにはどうすればよいですか?

ポインター参照を扱うときに Go でインターフェイス値の真のコピーを作成するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-07 09:40:15
オリジナル
690 人が閲覧しました

How to Create True Copies of Interface Values in Go When Dealing with Pointer References?

インターフェイス値のコピーと参照

Go では、個別の状態を維持するためにインターフェイス値のコピーを作成する必要があるシナリオに遭遇することがあります。ポインター参照を保持するインターフェイス値をコピーするときは、その影響を考慮することが重要です。この記事では、このようなシナリオの処理方法を検討し、真のコピーを作成するテクニックを紹介します。

問題: ポインター参照を介した値の共有

指定された例では、user1 はポインターを介して Admin 構造体を参照します。これは、user1 を user2 に割り当てると、基本的に user2 が同じ基礎となる Admin 構造体を指すことになることを意味します。 user1 または user2 のいずれかを介して行われた変更は、元の構造体に影響します。

解決策 1: 基礎となる構造体を明示的にコピーする

個別のコピーを作成する 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
ログイン後にコピー

解決策 2: を使用するReflection

より一般的な解決策として、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 サイトの他の関連記事を参照してください。

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