التقطيع: خطأ خارج الحدود أثناء الانتقال
في التنقل، يتضمن التقطيع استخراج جزء من شريحة موجودة لإنشاء شريحة جديدة شريحة. عند حدوث خطأ خارج الحدود أثناء التقطيع، فهذا يشير إلى أن النطاق المحدد يتجاوز حدود الفهرس الصالحة للشريحة المصدر.
ضع في اعتبارك مقتطف التعليمات البرمجية التالي:
a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[1:] printSlice("c", c)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x)
}
يؤدي تشغيل هذا الرمز إلى خطأ خارج الحدود:
a len=5 cap=5 [0 0 0 0 0] b len=0 cap=5 [] panic: runtime error: slice bounds out of range goroutine 1 [running]: main.main() /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10 0x150
لفهم سبب حدوث هذا الخطأ، نحتاج إلى التعمق في القواعد التي تحكم التقطيع في Go.
التقطيع القواعد
عند تقطيع شريحة أو مصفوفة، يمكن أن تكون المؤشرات المحددة صريحة أو ضمنية. إذا لم يتم توفير الفهرس بشكل صريح، فسيتم تعيينه افتراضيًا على قيمة محددة. بالنسبة للشرائح:
في الكود المحدد، يحدث الخطأ لأن تعبير التقطيع لإنشاء شريحة c هو:
c := b[1:]
هذا يعني أن الحد الأدنى (1) محدد بشكل صريح، ولكن الحد الأعلى ليس كذلك. ولذلك، فإن القيمة الافتراضية هي len(b)، وهي 0. ومع ذلك، يجب أن يكون الحد الأدنى المحدد (1) أقل من أو يساوي الحد الأعلى (0). لم يتم استيفاء هذا الشرط، مما أدى إلى حدوث خطأ خارج الحدود.
لتجنب هذا الخطأ، يمكنك تحديد الحدود الدنيا والعليا بشكل صريح. على سبيل المثال، لاستخراج العنصر الثاني فقط من الشريحة b، يمكنك كتابة:
c := b[1:2] // c len=1 cap=4 [0]
بدلاً من ذلك، إذا كنت تريد استخراج الشريحة b بأكملها بدءًا من العنصر الثاني، فيمكنك استخدام:
c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3