Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk memahami kepingan dalam struktur Golang

Bagaimana untuk memahami kepingan dalam struktur Golang

WBOY
WBOYke hadapan
2024-02-08 21:45:12898semak imbas

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

Di Golang, struktur ialah jenis data tersuai yang boleh mengandungi berbilang medan. Dalam struktur, kepingan ialah tatasusunan dinamik yang boleh dikembangkan atau dikurangkan mengikut keperluan. Walau bagaimanapun, memahami kepingan dalam struktur Golang boleh menyebabkan kekeliruan. Dalam artikel ini, editor PHP Youzi akan menerangkan kepada anda secara terperinci prinsip kerja dan penggunaan kepingan dalam struktur Golang, membantu anda memahami dan menggunakan ciri ini dengan lebih baik. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan memberikan anda pengetahuan yang berharga dan petua praktikal untuk menjadikan anda lebih selesa dalam pembangunan Golang.

Kandungan soalan

Saya baru di Golang dan saya cuba memahami petunjuk

type deque struct {
    indexes []int
}

func (d *deque) push(i int) {
    d.indexes = append(d.indexes, i)
}

Indeks di sini ialah hirisan dan bukannya penunjuk kepada hirisan.

Bagaimanakah indeks sebenarnya disimpan dalam ingatan?

Sebagai contoh: apabila kita memulakan contoh deque, kita memanggilnya dq, dan dalam ingatan, alamat dq ialah 0x1001 (kami memanggilnya adr(dq)).

Apakah pembolehubah yang disimpan dalam adr(dq)? Adakah ia penunjuk kepada tatasusunan?

0x1001 -> Ox8009 (alamat elemen pertama tatasusunan)

Atau tatasusunan itu sendiri?

0x1001 -> Elemen pertama hirisan

0x1002 -> Elemen kedua hirisan

Apa yang berlaku apabila kita:

d.indexes = append(d.indexes, i)

Apa bezanya jika kita takrifkan:

type deque struct {
    indexes *[]int
}

Penyelesaian

Sebagai contoh, alamat contoh deque dalam ingatan ialah 0x1001. Ia memulakan:

0x1001 -> [indexes: nil]

Jika anda menambah elemen baharu (dq.push(12)):

0x1001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)]
0x3001 -> [12]
Struktur kepingan di

0x1001 mengandungi maklumat tentang panjang dan kapasiti kepingan (panjang: 1, kapasiti: 1), data sebenar disimpan di alamat lain (katakan 0x3001, tatasusunan[12]). p>

Jika menolak elemen lain (dq.push(34)、dq.push(56)).

0x1001 -> [length: 3, capacity: 4, data: 0x5001 (new pointer to data due to capacity, capacity doubles)]
0x5001 -> [12, 34, 56]

Kod 1:

type deque struct {
    indexes []int
}
func (d *deque) push(i int) {
    d.indexes = append(d.indexes, i)
}
func main() {
    dq := deque{}
    dq.push(12)
    dq.push(34)
    dq.push(56)
    fmt.Println("Deque elements:", dq.indexes)
}

Output 1:

Deque elements: [12 34 56]

Jika menggunakan penunjuk ke kepingan (*[]int) 而不是切片本身 ([]int). Ini bermakna bahawa medan indeks akan memegang penunjuk pada kepingan, dan penunjuk itu perlu dimulakan sebelum menggunakannya.

Jika anda menambah elemen baharu (dq.push(12)),则0x2001就是indexes), maka

ialah alamat struktur kepingan asas yang ditunjuk oleh indeks

0x1001 -> [indexes: 0x2001 (pointer to slice)]
0x2001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)]
0x3001 -> [12]
Struktur kepingan di 0x2001

mengandungi maklumat panjang dan kapasiti kepingan (panjang: 1, kapasiti: 1), dan data sebenar disimpan di alamat lain (0x3001, tatasusunan[12]).

dq.push(34)、dq.push(56)Jika menolak elemen lain (

).

0x1001 -> [indexes: 0x2001 (pointer to slice)]
0x2001 -> [length: 3, capacity: 4, data: 0x5001 (new data pointer, due to capacity, capacity doubles)]
0x5001 -> [12, 34, 56]

Kod 2:

type deque struct {
    indexes *[]int
}

func (d *deque) push(i int) {
    if d.indexes == nil {    // initialize the slice if it's nil
        d.indexes = &[]int{}
    }
    *d.indexes = append(*d.indexes, i)
}

func main() {
    dq := deque{}
    dq.push(12)
    dq.push(34)
    dq.push(56)
    fmt.Println("Deque elements:", *dq.indexes)
}

Output 2: 🎜
Deque elements: [12 34 56]

Atas ialah kandungan terperinci Bagaimana untuk memahami kepingan dalam struktur Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam