حل مشكلة في جولانج: فهم استخدام دالة copy لنسخ الشرائح
عند فحص البرنامج المرفق، يظهر أن هناك سببين رئيسيين لعدم عمل النسخ بالشكل المتوقع.
أولاً، في السطر:
gomySlice2 = mySlice1[0:2]
تقوم بتعيين mySlice2
ليكون مؤشرًا على الجزء الأول من mySlice1
، وعند استخدام copy
بعد ذلك، يبدأ التأثير من الفهرس 0، وليس من الفهرس الذي تم تعيين mySlice2
للإشارة إليه. لذلك، يبدأ النسخ من mySlice1[0]
و mySlice1[1]
فقط.
لحل هذه المشكلة، يمكنك إما تجنب تعيين mySlice2
في البداية أو استخدام النص التالي:
gomySlice2 = mySlice1[:2]
بهذه الطريقة، يكون لديك mySlice2
يشير إلى نفس النطاق الذي سيتم نسخه من mySlice1
.
السبب الثاني هو أن copy
تعتبر الطول الأصغر من النصين، وفي هذه الحالة، الطول الأصغر هو 2 (طول mySlice2
). لذا، يجب أن يتم النسخ فقط لأول عنصرين من mySlice1
. لتجاوز هذه المشكلة، يمكنك زيادة طول mySlice2
ليكون مساويًا لطول mySlice1
قبل استخدام copy
:
gomySlice2 = make([]int, len(mySlice1))
copy(mySlice2, mySlice1)
باستخدام هذا التعديل، ستحصل على النتيجة المتوقعة عند طباعة mySlice2
.
المزيد من المعلومات
في هذا البرنامج المكتوب بلغة البرمجة جولانج (Golang)، يتم إنشاء مصفوفتين من الأرقام الصحيحة. المصفوفة الأولى (mySlice1) تحتوي على العناصر [1, 3, 5, 7, 9, 11]، بينما تُبنى المصفوفة الثانية (mySlice2) باستخدام الدالة make وتُعين إليها طولًا محددًا من العناصر (3 عناصر).
ثم يتم تعيين العناصر الأولى من mySlice1 (من العنصر 0 إلى العنصر 1) إلى mySlice2 باستخدام الفهرسة mySlice1[0:2]. ومن ثم، يتم استخدام دالة copy لنسخ 3 عناصر من mySlice1 إلى mySlice2.
ومع ذلك، عند طباعة mySlice2، يظهر فقط عنصرين [1, 3]. لتفهم السبب وراء هذا التصرف، يجب فهم كيفية عمل الدالة copy في جولانج.
تعمل دالة copy على نسخ عناصر المصفوفة المصدر (المصفوفة الأولى) إلى المصفوفة الهدف (المصفوفة الثانية). وفي هذه الحالة، المصفوفة الهدف هي mySlice2.
مشكلتك تكمن في أن mySlice2 تمت إعادة تعيينها لتشير إلى نفس العناصر التي تم نسخها إليها، لذا العملية تظهر كما لو أن copy لم تؤدي إلى نتيجة مختلفة.
لتجنب هذه المشكلة، يمكنك إما استخدام دالة append لإضافة العناصر المنسوخة إلى نهاية mySlice2، أو استخدام copy للعناصر من mySlice1 إلى mySlice2 بدون الحاجة للفهرسة الإضافية. إليك تعديل للبرنامج:
gopackage main
import "fmt"
func main() {
mySlice1 := []int{1, 3, 5, 7, 9, 11}
mySlice2 := make([]int, 3)
// استخدام copy بدون فهرسة إضافية
copy(mySlice2, mySlice1)
fmt.Printf("%T\t%T\n", mySlice1, mySlice2)
fmt.Println(mySlice1, mySlice2)
}
بهذا التعديل، سيتم نسخ العناصر مباشرة من mySlice1 إلى mySlice2 دون الحاجة لإعادة تعيين mySlice2.