スライスとマップ: パラメーター参照の動作を理解する
Go では、スライスとマップは両方とも参照型を表します。どちらのタイプの要素を変更しても、その変更はそれらから派生したすべてのスライス/マップに反映されます。この共有変更動作は、マップのポインタベースの実装から生じ、ポインタを介して行われた変更は元のマップに適用されます。
ただし、新しい要素を追加する場合、スライスとマップの動作は異なります。提供されているコード例では、新しい要素をマップ (editMap) に追加すると、元のマップからそれらの要素にアクセスできるようになります。ただし、スライスへの追加 (editSlice) は、元のスライスには影響しません。
この矛盾は、スライスとマップの間の根本的な実装の違いに起因します。マップはハッシュ マップ構造へのポインターとして実装されますが、スライスは配列を参照する軽量の構造体です。新しい要素をマップに追加する場合、ポインタは一定のままであり、派生したすべてのマップで新しい要素が表示されます。
対照的に、スライスに追加する場合、スライス ヘッダー (スライスの長さを記述し、容量、配列ポインタなど)を変更する必要があります。ただし、Go は変数を値で渡すため、スライス ヘッダーのコピー (渡されたパラメーター内) に加えられた変更は元のスライスには反映されません。
スライスとマップの間で一貫した動作を実現するには、マップと同様に、スライスをポインタとして実装することもできます。これにより、スライスへのポインタを介して行われた変更によって、元のスライスも変更されることが保証されます。ただし、スライス ポインターの受け渡しと操作に対する言語サポートが不足しているため、このアプローチは Go では一般的ではありません。代わりに、変更後に新しいスライスを返すという規則が広く採用されています。
以上がGo スライスとマップ: 追加の動作が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。