ホームページ  >  記事  >  バックエンド開発  >  Golang スライスのインデックス値または参照?

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

王林
王林転載
2024-02-09 08:42:17585ブラウズ

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 までご連絡ください。