データ構造のディープ コピーには、同じデータを含む新しいインスタンスの作成が含まれます。オリジナルですが、それから独立しています。 Go ではディープ コピー関数が組み込まれていないため、神のような外部ライブラリがこの目的に役立つ場合があります。ただし、Go エコシステム内でのこのようなライブラリの制限を理解することが重要です。
ゴッドを使用して次のディープ コピーを実行するシナリオを考えてみましょう。ハッシュ セット:
var c, d hashset.Set c = *hashset.New() c.Add(1) deepcopy.Copy(d, c) c.Add(2) fmt.Println(c.Contains(2)) // true fmt.Println(d.Contains(2)) // false fmt.Println(c.Contains(1)) // true fmt.Println(d.Contains(1)) // false
私たちの予想に反して、ディープ コピー操作ではハッシュ セットの内容が完全には複製されません。ライブラリがエクスポートされていない値をコピーできないために問題が発生します。
ゴッド ライブラリは、他の多くの同様のライブラリと同様、エクスポートされていない値のコピーに関して制限に直面しています。 Go の設計によって課せられた制限。これは、そのようなライブラリでデータ構造インスタンスを完全に複製するにはコードの変更が必要であることを意味しますが、その複雑さのため望ましくない解決策です。
残念ながら、Go にはネイティブな方法が提供されていません。ディープコピーを実行します。エクスポートされていないフィールドの読み取りを可能にするツールである Reflection を使用してそれらを設定することはできません。安全でないパッケージの使用は、可能ではありますが、不安定でプラットフォームに依存するプログラムを作成する可能性があるため、推奨されません。
慣用的なディープ コピー アプローチがないため、パッケージ自体内でクローン作成をサポートすることの重要性が強調されています。
Go には専用のディープ コピー メカニズムがありませんが、特定のシナリオでは特定の回避策が存在します。たとえば、新しいマップを作成し、キーと値のペアを手動で繰り返して複製することで、マップのクローンを作成できます。
もう 1 つの手法は、代入を使用して、エクスポートされていないフィールドを含む構造体の「正確な」コピーを作成することです。ただし、このアプローチでは、コピーされたインスタンス内のエクスポートされていないフィールドを変更することはできません。
以上がGo でデータ構造を効果的にディープコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。