Go でのスライスの動作を理解する: 追加すると元のスライスが変更されるのはなぜですか?
提供されたコード スニペットには、関数 someFunc があります。整数のスライスを操作します。関数内で、一時スライス tempA が作成され、入力スライス A の値が割り当てられます。ただし、tempA に追加すると、元の A も変更されます。この動作は直観に反しているように思えるかもしれません。そのため、なぜそれが起こるのかを調べてみましょう。
Go では、スライスはデータ型 []T として宣言されます。ここで、T は要素の型を表します。その名前にもかかわらず、スライスはメモリ内に連続して格納される要素のコレクションではありません。代わりに、これは次の情報を含むヘッダー構造です:
スライスの値を割り当てるとき変数を使用する場合、配列全体をコピーするわけではありません。代わりに、同じ基礎となる配列を指す新しいスライス ヘッダーを作成します。したがって、tempA への追加などの操作を実行すると、基になる配列も変更され、その結果、元のスライス A の値も変更されます。
この動作は、効率的なメモリ管理を確保し、不必要なメモリ管理を回避するために不可欠です。コピーすること。ポインターベースのアプローチを使用することにより、Go スライスは、別々の長さと容量の値を維持しながら、同じ基礎となる配列を共有できます。これにより、コストのかかるコピー操作を必要とせずに、スライスに軽量な変更を加えることができます。
スライスの動作と基礎となるデータ構造をより深く理解するには、次のリソースを参照してください: https://blog.golang.org/スライス
以上がGo スライスのコピーに追加するとオリジナルが変更されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。