ホームページ > バックエンド開発 > Golang > Go スライスのコピーに追加するとオリジナルが変更されるのはなぜですか?

Go スライスのコピーに追加するとオリジナルが変更されるのはなぜですか?

Barbara Streisand
リリース: 2024-11-27 15:28:11
オリジナル
172 人が閲覧しました

Why Does Appending to a Go Slice Copy Change the Original?

Go でのスライスの動作を理解する: 追加すると元のスライスが変更されるのはなぜですか?

提供されたコード スニペットには、関数 someFunc があります。整数のスライスを操作します。関数内で、一時スライス tempA が作成され、入力スライス A の値が割り当てられます。ただし、tempA に追加すると、元の A も変更されます。この動作は直観に反しているように思えるかもしれません。そのため、なぜそれが起こるのかを調べてみましょう。

Go では、スライスはデータ型 []T として宣言されます。ここで、T は要素の型を表します。その名前にもかかわらず、スライスはメモリ内に連続して格納される要素のコレクションではありません。代わりに、これは次の情報を含むヘッダー構造です:

  • 長さ: スライス内の要素の数
  • 容量: 基礎となる配列が保持できる要素の数
  • ポインタ: スライス データが格納されている基になる配列への参照

スライスの値を割り当てるとき変数を使用する場合、配列全体をコピーするわけではありません。代わりに、同じ基礎となる配列を指す新しいスライス ヘッダーを作成します。したがって、tempA への追加などの操作を実行すると、基になる配列も変更され、その結果、元のスライス A の値も変更されます。

この動作は、効率的なメモリ管理を確保し、不必要なメモリ管理を回避するために不可欠です。コピーすること。ポインターベースのアプローチを使用することにより、Go スライスは、別々の長さと容量の値を維持しながら、同じ基礎となる配列を共有できます。これにより、コストのかかるコピー操作を必要とせずに、スライスに軽量な変更を加えることができます。

スライスの動作と基礎となるデータ構造をより深く理解するには、次のリソースを参照してください: https://blog.golang.org/スライス

以上がGo スライスのコピーに追加するとオリジナルが変更されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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