ホームページ  >  記事  >  バックエンド開発  >  Golang 構造のスライスを理解する方法

Golang 構造のスライスを理解する方法

WBOY
WBOY転載
2024-02-08 21:45:12897ブラウズ

如何理解 Golang 结构体中的切片

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)
}

Solution

たとえば、メモリ内の両端キュー インスタンスのアドレスは 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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。