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

Bagaimana untuk memahami kepingan dalam struktur Golang

WBOY
Lepaskan: 2024-02-08 21:45:12
ke hadapan
970 orang telah melayarinya

如何理解 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)
}
Salin selepas log masuk

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)
Salin selepas log masuk

Apa bezanya jika kita takrifkan:

type deque struct {
    indexes *[]int
}
Salin selepas log masuk

Penyelesaian

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

0x1001 -> [indexes: nil]
Salin selepas log masuk

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

0x1001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)]
0x3001 -> [12]
Salin selepas log masuk
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]).

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]
Salin selepas log masuk

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)
}
Salin selepas log masuk

Output 1:

Deque elements: [12 34 56]
Salin selepas log masuk
Salin selepas log masuk

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]
Salin selepas log masuk
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]
Salin selepas log masuk

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)
}
Salin selepas log masuk

Output 2: 🎜
Deque elements: [12 34 56]
Salin selepas log masuk
Salin selepas log masuk

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

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan