Memahami Slices: Kapasiti vs. Panjang
Apabila berurusan dengan kepingan dalam Go, adalah penting untuk memahami hubungan antara kapasiti dan panjang. Kapasiti merujuk kepada saiz tatasusunan yang mendasari tempat hirisan beroperasi, manakala panjang menentukan bilangan elemen yang sedang disertakan dalam hirisan.
Ralat Masa Jalan: Panjang Potongan Melebihi Kapasiti
Ralat "ralat masa jalan: makeslice: had out of range" berlaku apabila cuba membuat kepingan dengan kapasiti kurang daripada panjangnya. Ralat ini timbul kerana kepingan mengikut reka bentuk mengekalkan invarian yang panjangnya tidak boleh melebihi kapasiti:
0 ≤ len(s) ≤ cap(s)
Dalam kod contoh anda:
type b []int var k = make([]b, 10, 5) fmt.Println(k[8])
Anda telah menentukan jenis hirisan k []b, dengan b ialah jenis kepingan lain. Walau bagaimanapun, anda telah cuba mencipta kepingan ini dengan kapasiti 5, yang tidak mencukupi untuk menampung panjang 10. Oleh itu, ralat masa jalanが発生します。
Mengapa Bukan Masa Penyusun Ralat?
Dalam kes tertentu, seperti kes anda di mana nilai kapasiti dan panjang adalah statik, pengkompil berkemungkinan mengesan ralat pada masa penyusunan. Walau bagaimanapun, ini tidak selalu dapat dilaksanakan. Pertimbangkan kod berikut:
package main import ( "fmt" "rand" ) func main() { k := make([]int, rand.Int(), rand.Int()) fmt.Println(k) }
Di sini, nilai kapasiti dan panjang ditentukan secara dinamik pada masa jalan menggunakan pakej rand. Oleh itu, pengkompil tidak dapat mengesahkan secara statik bahawa kapasiti akan sentiasa melebihi panjang dan, oleh itu, mesti mewakilkan semakan ini kepada masa jalan.
Atas ialah kandungan terperinci Mengapa Pergi Melemparkan Ralat Masa Jalan Apabila Panjang Slice Melebihi Kapasitinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!