Di Go, kepingan adalah struktur data yang fleksibel dan berkuasa yang dibina di atas array. Ia mempunyai dua sifat utama: panjang dan kapasiti.
len()
.cap()
. Berikut adalah contoh mudah yang menunjukkan penggunaan len()
dan cap()
:
<code class="go">package main import "fmt" func main() { s := make([]int, 5, 10) // Creates a slice with length 5 and capacity 10 fmt.Printf("Length: %d, Capacity: %d\n", len(s), cap(s)) }</code>
Dalam contoh ini, Slice s
mempunyai panjang 5 dan kapasiti 10.
Kapasiti kepingan di Go tidak berubah sebaik sahaja ia dibuat. Anda tidak boleh mengubah suai kapasiti kepingan yang sedia ada. Walau bagaimanapun, anda boleh membuat kepingan baru dengan kapasiti yang berbeza menggunakan beberapa kaedah:
Menggunakan fungsi make
: Anda boleh membuat kepingan baru dengan panjang dan kapasiti yang ditentukan.
<code class="go">newSlice := make([]int, len(oldSlice), newCapacity) copy(newSlice, oldSlice)</code>
Menggunakan fungsi append
: Apabila anda menambah elemen ke kepingan, GO akan secara automatik meningkatkan kapasiti jika perlu.
<code class="go">s := []int{1, 2, 3} s = append(s, 4, 5, 6) // This might increase the capacity if needed</code>
Menggunakan fungsi copy
: Anda boleh menyalin kandungan kepingan lama ke kepingan baru dengan kapasiti yang berbeza.
<code class="go">newSlice := make([]int, len(oldSlice), newCapacity) copy(newSlice, oldSlice)</code>
Inilah contoh untuk menggambarkan kaedah ini:
<code class="go">package main import "fmt" func main() { s := []int{1, 2, 3} // Length: 3, Capacity: 3 fmt.Printf("Original: Length: %d, Capacity: %d\n", len(s), cap(s)) // Using make and copy newSlice := make([]int, len(s), 10) copy(newSlice, s) fmt.Printf("After make and copy: Length: %d, Capacity: %d\n", len(newSlice), cap(newSlice)) // Using append s = append(s, 4, 5, 6, 7) fmt.Printf("After append: Length: %d, Capacity: %d\n", len(s), cap(s)) }</code>
Di Go, cuba mengakses indeks di luar panjang kepingan akan menghasilkan panik runtime. Ini kerana panjang kepingan mentakrifkan julat indeks yang anda dapat mengakses dengan selamat.
Inilah contoh:
<code class="go">package main import "fmt" func main() { s := []int{1, 2, 3} // Length: 3 fmt.Println(s[0]) // This is valid fmt.Println(s[3]) // This will cause a runtime panic }</code>
Mesej ralat yang akan anda lihat adalah seperti ini:
<code>panic: runtime error: index out of range [3] with length 3</code>
Panik ini berlaku kerana Indeks 3 berada di luar batas kepingan, yang panjangnya 3.
Panjang dan kapasiti kepingan dalam pergi melayani tujuan yang berbeza dan mempunyai peranan yang berbeza:
len(s) - 1
, dan cuba mengakses indeks di luar ini akan menghasilkan panik runtime.append
tanpa mencetuskan pengagihan semula memori.Inilah ringkasan perbezaan mereka:
Panjang :
len(s)
.Kapasiti :
cap(s)
.Berikut adalah contoh yang menggambarkan konsep -konsep ini:
<code class="go">package main import "fmt" func main() { s := make([]int, 3, 5) // Length: 3, Capacity: 5 fmt.Printf("Initial: Length: %d, Capacity: %d\n", len(s), cap(s)) s = append(s, 4) // Length: 4, Capacity: 5 fmt.Printf("After first append: Length: %d, Capacity: %d\n", len(s), cap(s)) s = append(s, 5) // Length: 5, Capacity: 5 fmt.Printf("After second append: Length: %d, Capacity: %d\n", len(s), cap(s)) s = append(s, 6) // Length: 6, Capacity might increase fmt.Printf("After third append: Length: %d, Capacity: %d\n", len(s), cap(s)) }</code>
Dalam contoh ini, kepingan bermula dengan panjang 3 dan kapasiti 5. Apabila kita menambahkan unsur -unsur, panjangnya meningkat sehingga mencapai kapasiti. Kapasiti boleh meningkat apabila kita melebihi kapasiti asal.
Atas ialah kandungan terperinci Berapakah kapasiti dan panjang kepingan di Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!