ホームページ > バックエンド開発 > Golang > 関数パラメータとして渡された場合、Go のマップとスライスの動作が異なるのはなぜですか?

関数パラメータとして渡された場合、Go のマップとスライスの動作が異なるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-14 14:02:12
オリジナル
563 人が閲覧しました

Why Do Go's Maps and Slices Behave Differently When Passed as Function Parameters?

スライスとマップのパラメータとしての動作が異なる理由

Go では、スライス参照型とマップ参照型は、関数パラメータとして渡されたときに対照的な動作を示します。マップはデータ構造へのポインターであり、関数内の要素に加えられた変更を反映します。ただし、配列ポインタ、長さ、容量を格納する構造体であるスライスに追加された新しい要素は、引数には反映されません。

この違いは、基礎となる実装に起因します。

  • マップ: マップはデータ構造へのポインターです。つまり、マップが関数に渡されると、実際の構造へのポインターが提供されます。地図。マップの要素に対する変更は、ポインタが変更されないままであるため、元のマップに反映されます。
  • スライス: 一方、スライスは、配列ポインタ、長さ、および配列を含む構造体です。容量。スライスが関数に渡されると、コンパイラはスライス ヘッダー (つまり、構造体) のコピーを作成します。スライスに変更が加えられた場合、その変更はコピーにのみ影響します。この関数は元のスライスについては認識せず、スライスに追加された新しい要素は元のスライスには反映されません。

この動作は、Go の値渡しセマンティクスによってさらに影響されます。の値が関数に渡されます。マップはポインターであるため、依然として値によって渡されますが、コピーは依然として同じ基礎となるデータ構造を指します。これにより、変更をオリジナルに反映することができます。ただし、スライスが渡されると、スライス ヘッダーのコピーが作成され、そのコピーに対する変更は元のヘッダーには反映されません。

スライスに対して同様の動作を実現するには、ポインタを渡す必要があります。スライスに変換し、事実上隠しポインタにします。ただし、この方法が使用されることはほとんどなく、代わりに、必要な変更を加えた新しいスライスを返す方法がより一般的です。

以上が関数パラメータとして渡された場合、Go のマップとスライスの動作が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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