ホームページ >バックエンド開発 >Golang >Go スライスとマップ: 追加の動作が異なるのはなぜですか?

Go スライスとマップ: 追加の動作が異なるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-19 17:13:10342ブラウズ

Go Slices vs. Maps: Why Do Appends Behave Differently?

スライスとマップ: パラメーター参照の動作を理解する

Go では、スライスとマップは両方とも参照型を表します。どちらのタイプの要素を変更しても、その変更はそれらから派生したすべてのスライス/マップに反映されます。この共有変更動作は、マップのポインタベースの実装から生じ、ポインタを介して行われた変更は元のマップに適用されます。

ただし、新しい要素を追加する場合、スライスとマップの動作は異なります。提供されているコード例では、新しい要素をマップ (editMap) に追加すると、元のマップからそれらの要素にアクセスできるようになります。ただし、スライスへの追加 (editSlice) は、元のスライスには影響しません。

この矛盾は、スライスとマップの間の根本的な実装の違いに起因します。マップはハッシュ マップ構造へのポインターとして実装されますが、スライスは配列を参照する軽量の構造体です。新しい要素をマップに追加する場合、ポインタは一定のままであり、派生したすべてのマップで新しい要素が表示されます。

対照的に、スライスに追加する場合、スライス ヘッダー (スライスの長さを記述し、容量、配列ポインタなど)を変更する必要があります。ただし、Go は変数を値で渡すため、スライス ヘッダーのコピー (渡されたパラメーター内) に加えられた変更は元のスライスには反映されません。

スライスとマップの間で一貫した動作を実現するには、マップと同様に、スライスをポインタとして実装することもできます。これにより、スライスへのポインタを介して行われた変更によって、元のスライスも変更されることが保証されます。ただし、スライス ポインターの受け渡しと操作に対する言語サポートが不足しているため、このアプローチは Go では一般的ではありません。代わりに、変更後に新しいスライスを返すという規則が広く採用されています。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。