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.
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 }
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]
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
0x1001 -> [indexes: 0x2001 (pointer to slice)] 0x2001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)] 0x3001 -> [12]
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]
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) }
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!