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

WBOY
リリース: 2024-02-08 21:45:12
転載
928 人が閲覧しました

如何理解 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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!