Golang では、構造体は複数のフィールドを含めることができるカスタム データ型です。構造において、スライスは必要に応じて拡張または縮小できる動的配列です。ただし、Golang 構造体のスライスを理解すると、混乱が生じる可能性があります。この記事では、PHP エディターの Youzi が、Golang 構造におけるスライスの動作原理と使用法を詳細に説明し、この機能をよりよく理解して適用できるようにします。初心者でも経験豊富な開発者でも、この記事は Golang 開発をより快適にするための貴重な知識と実践的なヒントを提供します。
Golang は初めてで、ポインタを理解しようとしています
リーリーここでのインデックスは、スライスへのポインタではなく、スライスです。
インデックスは実際にどのようにメモリに保存されるのでしょうか?
例: deque インスタンスを開始するとき、それを dq と呼びます。メモリ内では、dq のアドレスは 0x1001 です (これを adr(dq) と呼びます)。
adr(dq) に格納される変数は何ですか?配列へのポインタでしょうか?
0x1001 -> Ox8009 (配列の最初の要素のアドレス)
それとも配列自体ですか?
0x1001 -> スライスの最初の要素
0x1002 -> スライスの 2 番目の要素
次の場合に何が起こりますか:
リーリー次のように定義した場合の違いは何ですか:
type deque struct { indexes []int } func (d *deque) push(i int) { d.indexes = append(d.indexes, i) }
たとえば、メモリ内の両端キュー インスタンスのアドレスは 0x1001
です。
初期化します:
新しい要素を追加する場合 (dq.push(12)
):
0x1001
のスライス構造にはスライスの長さと容量 (長さ: 1、容量: 1) に関する情報が含まれており、実際のデータは別のアドレス (0x3001、array[12] と仮定) に格納されます。 p>
他の要素をプッシュする場合 (dq.push(34)、dq.push(56)
)。
コード1:
リーリー出力1:
リーリースライス自体 ([]int)
の代わりにスライス (*[]int)
へのポインターを使用する場合。これは、インデックス フィールドがスライスへのポインタを保持し、そのポインタを使用する前に初期化する必要があることを意味します。
新しい要素 (dq.push(12)
) を追加する場合、0x2001
は、indexes
が指す基礎となるスライス構造のアドレスになります。
0x2001
のスライス構造にはスライスの長さと容量の情報 (長さ: 1、容量: 1) が含まれており、実際のデータは別のアドレス (0x3001、配列 [12]) に格納されます。 。
他の要素をプッシュする場合 (dq.push(34)、dq.push(56)
)。
コード2:
リーリー出力 2:
リーリー以上がGolang 構造のスライスを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。