"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا أحصل على خطأ في حدود الشريحة خارج النطاق في Go Slicing؟

لماذا أحصل على خطأ في حدود الشريحة خارج النطاق في Go Slicing؟

تم النشر بتاريخ 2024-12-21
تصفح:884

Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?

التقطيع: خطأ خارج الحدود أثناء الانتقال

في التنقل، يتضمن التقطيع استخراج جزء من شريحة موجودة لإنشاء شريحة جديدة شريحة. عند حدوث خطأ خارج الحدود أثناء التقطيع، فهذا يشير إلى أن النطاق المحدد يتجاوز حدود الفهرس الصالحة للشريحة المصدر.

ضع في اعتبارك مقتطف التعليمات البرمجية التالي:

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.

التقطيع القواعد

عند تقطيع شريحة أو مصفوفة، يمكن أن تكون المؤشرات المحددة صريحة أو ضمنية. إذا لم يتم توفير الفهرس بشكل صريح، فسيتم تعيينه افتراضيًا على قيمة محددة. بالنسبة للشرائح:

  • افتراضيات الحد الأدنى المفقودة هي 0.
  • افتراضيات الحد العلوي المفقودة هي len(slice) (وليس cap(slice)).

في الكود المحدد، يحدث الخطأ لأن تعبير التقطيع لإنشاء شريحة 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