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

لماذا تحدث الكتابة فوق المتغير في Go عند إلحاق شرائح من نفس المصفوفة؟

تم النشر بتاريخ 2024-11-10
تصفح:302

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

سبب الكتابة الفوقية المتغيرة في Go

يواجه الكود الخاص بك مشكلة في الكتابة فوق المتغير لأنك تقوم بإنشاء شرائح جديدة (pathA و pathB) عن طريق إلحاق عناصر بنفس مصفوفة الدعم (المسار) داخل حلقة.

خلفية عن الشرائح في Go:

  • شريحة Go هي بنية بيانات تمثل كتلة متجاورة من العناصر من نفس النوع.
  • الشرائح لها طول (عدد العناصر المخزنة حاليًا ) والسعة (الحد الأقصى لعدد العناصر التي يمكنها الاحتفاظ بها).
  • عند تعديل شريحة، قد يؤدي ذلك إلى تخصيص مصفوفة دعم جديدة إذا كانت السعة تم تجاوزها.

مشكلة في الكود الخاص بك:

في الكود الخاص بك، أنت تقوم بإنشاء شريحتين جديدتين، pathA وpathB، باستخدام وظيفة الإلحاق:

pathA := append(route, nextA)
pathB := append(route, nextB)

إليك ما يحدث:

  1. في البداية، يحتوي المسار على سعة يمكن أن تناسب كلاً من nextA وnextB. لذلك، يتم إنشاء شريحتين جديدتين (pathA وpathB) بنفس مصفوفة الدعم مثل المسار.
  2. مع تقدم الحلقة ومواصلة الإلحاق بالمسار، تتجاوز سعتها في النهاية طولها.
  3. في التكرار اللاحق للحلقة، يتم تخصيص مصفوفة دعم جديدة للمسار. ومع ذلك، فإن pathA وpathB لا يزالان يشيران إلى مصفوفة الدعم القديمة.
  4. عند إلحاق nextB بالمسار، فإنه يكتب إلى العنصر الأخير في مصفوفة الدعم القديمة، والتي يتم مشاركتها بواسطة كل من pathA وpathB.
  5. ونتيجة لذلك، ينتهي كل من المسار A والمسار B بنفس النتيجة النهائية value.

الحل:

لتجنب هذه الكتابة الفوقية، تحتاج إلى التأكد من أن pathA وpathB لهما مصفوفات دعم فريدة. يمكنك تحقيق ذلك عن طريق إنشاء شريحة جديدة يدويًا لواحدة منها باستخدام الإنشاء والنسخ:

newRoute := make([]int, len(route), (cap(route) 1)*2) نسخ (طريق جديد، طريق) إذا كنت % 2 == 0 { المسار أ: = إلحاق (newRoute، nextA) } آخر { المسارB := إلحاق (newRoute، nextB)
            
بيان الافراج أعيد طبع هذه المقالة على: 1729727920 في حالة وجود أي مخالفة، يرجى التواصل مع [email protected] لحذفها
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3