検索
ホームページバックエンド開発GolangGo スライスのコピーに追加すると、元のスライスも変更されるのはなぜですか?

Why does appending to a copy of a Go slice also modify the original slice?

スライスの追加と元のスライスに対するその影響について

Go でスライスを操作する場合、新しい要素を追加するために append 関数がよく使用されます。既存のスライスに。ただし、多くの開発者は、この追加操作で元のスライスも変更できることを知って驚くかもしれません。

調査中のコード

次のコード スニペットを考えてみましょう:

func someFunc(A []int) int {
    for i := 0; i <p>ここで、someFunc 関数はスライス A を入力として受け取り、次に tempA という名前の A のコピーを作成してから呼び出します。 tempA から要素を削除する削除関数。動作中の関数を検査すると、次のコンソール出力に気づくかもしれません:</p><pre class="brush:php;toolbar:false">A:  [3 4 5 3 7]
tempA:  [3 4 5 3 7]

A:  [4 5 3 7 7]
tempA:  [4 5 3 7 7]

A:  [4 3 7 7 7]
tempA:  [4 3 7 7 7]

A:  [4 3 7 7 7]
tempA:  [4 3 7 7 7]

驚くべき副作用

コードが実行されると、次の内容が出力されます。 A と tempA の両方で、tempA で append が呼び出された後に元のスライス A も変更されることがわかります。 A の値によるコピーは tempA に加えられた変更から独立していると予想されるため、この動作は一見直観に反しているように見えるかもしれません。

ただし、この現象はスライスの実装方法の直接的な結果です。囲碁で。スライスは本質的に、ヘッダーと基礎となる配列へのポインターで構成される軽量のデータ構造です。ヘッダーにはスライスの長さと容量に関する情報が含まれており、ポインターはスライス内の最初の要素を指します。

A の値を tempA に割り当てると、基本的には、次を指す新しいスライス ヘッダーを作成することになります。 A と同じ基礎となる配列です。したがって、両方のスライスが同じデータを参照しているため、tempA に加えられた変更は A にも反映されます。

理解スライス ヘッダーと配列

この動作をさらに理解するには、Go でスライス ヘッダーと配列がどのように相互作用するかを理解するのに役立ちます。配列には、同じ型の要素の連続したブロックが含まれます。一方、スライスは、配列のセクションの動的なビューを提供します。これは配列内の連続した要素セットを記述しますが、基礎となる配列データを所有しません。

構文 []T{e1, e2, ..., を使用して配列からスライスを作成する場合en} を使用すると、基本的には配列の最初の要素を指す新しいスライス ヘッダーを作成することになります。スライスの長さは n に設定され、容量はスライス後の配列の残りの長さに設定されます。

同様に、構文 []T(arr) を使用してスライス ヘッダーを作成すると、 arr と同じ基礎となる配列を指すスライスを作成しています。スライスの長さは arr の長さに設定され、容量は arr の容量に設定されます。

影響とベスト プラクティス

スライスと配列の関係を理解すると、潜在的な落とし穴を回避し、より効率的な Go コードを作成するのに役立ちます。スライスを操作するときは、次の点に注意してください。

  • 同じ基礎となる配列への独立した参照を維持したい場合は、スライスを別のスライスに割り当てることは避けてください。
  • copy(dst) を使用してください。 、src) を使用して、同じ基になる配列を参照しながら、異なるヘッダーを持つ新しいスライスを作成します。
  • make 関数を使用して、特定の長さと容量のスライスを作成することを検討してください。新しい基礎となる配列。

Go スライスの内部を理解すると、コードが意図したとおりに動作することを確認しながら、その柔軟性と効率性を活用できるようになります。スライス ヘッダーと配列の微妙な違いを理解することで、Go でのスライスの技術をマスターし、この多用途なデータ構造の可能性を最大限に引き出すことができます。

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

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?Mar 03, 2025 pm 05:17 PM

この記事では、Goのパッケージインポートメカニズム:名前付きインポート(例:インポート "fmt&quot;)および空白のインポート(例:_&quot; fmt&quot;)について説明しています。 名前付きインポートはパッケージのコンテンツにアクセス可能になり、空白のインポートはtのみを実行します

Beegoフレームワークのページ間で短期情報転送を実装する方法は?Beegoフレームワークのページ間で短期情報転送を実装する方法は?Mar 03, 2025 pm 05:22 PM

この記事では、Webアプリケーションでのページ間データ転送のためのBeegoのnewflash()関数について説明します。 newflash()を使用して、コントローラー間で一時的なメッセージ(成功、エラー、警告)を表示し、セッションメカニズムを活用することに焦点を当てています。 リミア

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?Mar 03, 2025 pm 05:18 PM

この記事では、MySQLクエリの結果をGO structスライスに効率的に変換することを詳しく説明しています。 データベース/SQLのスキャン方法を使用して、手動で解析することを避けて強調しています。 DBタグとロブを使用した構造フィールドマッピングのベストプラクティス

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?Mar 10, 2025 pm 05:38 PM

この記事では、ユニットテストのためにGOのモックとスタブを作成することを示しています。 インターフェイスの使用を強調し、模擬実装の例を提供し、模擬フォーカスを維持し、アサーションライブラリを使用するなどのベストプラクティスについて説明します。 articl

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?Mar 10, 2025 pm 03:20 PM

この記事では、GENICSのGOのカスタムタイプの制約について説明します。 インターフェイスがジェネリック関数の最小タイプ要件をどのように定義するかを詳しく説明し、タイプの安全性とコードの再利用性を改善します。 この記事では、制限とベストプラクティスについても説明しています

Go言語でファイルを便利に書く方法は?Go言語でファイルを便利に書く方法は?Mar 03, 2025 pm 05:15 PM

この記事では、goで効率的なファイルの書き込みを詳しく説明し、os.writefile(小さなファイルに適している)とos.openfileおよびbuffered write(大規模ファイルに最適)と比較します。 延期エラー処理、Deferを使用し、特定のエラーをチェックすることを強調します。

Goでユニットテストをどのように書きますか?Goでユニットテストをどのように書きますか?Mar 21, 2025 pm 06:34 PM

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?Mar 10, 2025 pm 05:36 PM

この記事では、トレースツールを使用してGOアプリケーションの実行フローを分析します。 手動および自動計装技術について説明し、Jaeger、Zipkin、Opentelemetryなどのツールを比較し、効果的なデータの視覚化を強調しています

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。