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]
がマップ内の値のコピーを返し、それに割り当てられた値が失われるためです。ただし、次の問題は解決できます:
これにより、マップ内の bag
の item
フィールドが設定されます。
以上がGolang スライスのインデックス値または参照?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。