Golang スライスのインデックス値または参照?

王林
リリース: 2024-02-09 08:42:17
転載
568 人が閲覧しました

Golang Slice 索引价值还是参考?

php エディタ Xigua が、Golang のスライス インデックスの問題を紹介します。 Golang では、Slice はデータを簡単に追加、削除、変更、クエリできる柔軟な動的配列です。ただし、Slice を使用すると、インデックス付けの問題、つまりインデックス付けされた値が値のコピーなのか参照なのかの問題が発生することがあります。スライスを正しく使用するには、インデックスと参照の値の違いを理解することが重要です。次に、スライスをよりよく理解して適用できるように、この問題を詳しく調べます。

質問の内容

私は Go を学んでいますが、スライスのインデックス作成から得られる「もの」に混乱しています。 bag 型の構造体があるとします:

リーリー

次に、荷物リストがあるとしましょう:

リーリー

次に、itembag 変数の最初の要素の内容を変更してみます。単純に、私は次のことを行いました:

リーリー

私が得た答えは間違っています。なぜなら、item1 := itembag[0] を実行すると、itembag [0] がコピーされるからです (間違っている場合は修正してください)。 の値を item1 に割り当てます。これがこのブログの趣旨だと思います。

これを証明するために、itembag[0] のポインタを取得してその値を変更しようとしました。そして、おお、やりたかったことは達成できました:

リーリー

これは、スライス インデックス (つまり、slice[index]) を実行するときに、基になる項目ではなくその値のコピーを取得すると言えば意味が通じます。

ここで次のことを実行すると:

リーリー

結果は true ですが、これは私が期待したものではありませんでした。 itembag[0].item は、最初に itembag[0] を変数に割り当ててから、その基になる項目を参照した場合と構文的に同じであるように見えるためです。

golang コースの重要な章が抜けているような気がします。リダイレクト/説明があれば大歓迎です。

「スライス インデックスを参照で渡す」などの検索を試みましたが、Google で正確なキーワードを特定できませんでした。

解決策

代入操作により値がコピーされます。したがって、次のようにする場合:

リーリー

オブジェクトのコピーを itembag[0] にタイプ bag で作成します。これで、item1 にはそのコピーが作成され、これに加えた変更はそのコピーに対して行われます。

リーリー

割り当ての右側はポインターであるため、この操作はそのポインターのコピーを作成し、それを itemper に割り当てます。 itempr.item="x" を実行すると、(*itempr).item=x と同等となるため、ポインタの内容が変更されます。

itembag[0] はアドレス指定可能な値です。つまり、そのアドレスを取得できます。

https://www.php.cn/link/753a043674f0193523abc1bbce678686

Expression itembag[0].item もアドレス指定可能な値なので、これに何かを割り当てると、スライス自体に反映されます。

ただし、次の値はアドレス指定できません:

リーリー

これは、m[1] がマップ内の値のコピーを返し、それに割り当てられた値が失われるためです。ただし、次の問題は解決できます:

リーリー

これにより、マップ内の bagitem フィールドが設定されます。

以上がGolang スライスのインデックス値または参照?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!