البرمجة

حل مشكلة في جولانج: فهم استخدام دالة copy لنسخ الشرائح

عند فحص البرنامج المرفق، يظهر أن هناك سببين رئيسيين لعدم عمل النسخ بالشكل المتوقع.

أولاً، في السطر:

go
mySlice2 = mySlice1[0:2]

تقوم بتعيين mySlice2 ليكون مؤشرًا على الجزء الأول من mySlice1، وعند استخدام copy بعد ذلك، يبدأ التأثير من الفهرس 0، وليس من الفهرس الذي تم تعيين mySlice2 للإشارة إليه. لذلك، يبدأ النسخ من mySlice1[0] و mySlice1[1] فقط.

لحل هذه المشكلة، يمكنك إما تجنب تعيين mySlice2 في البداية أو استخدام النص التالي:

go
mySlice2 = mySlice1[:2]

بهذه الطريقة، يكون لديك mySlice2 يشير إلى نفس النطاق الذي سيتم نسخه من mySlice1.

السبب الثاني هو أن copy تعتبر الطول الأصغر من النصين، وفي هذه الحالة، الطول الأصغر هو 2 (طول mySlice2). لذا، يجب أن يتم النسخ فقط لأول عنصرين من mySlice1. لتجاوز هذه المشكلة، يمكنك زيادة طول mySlice2 ليكون مساويًا لطول mySlice1 قبل استخدام copy:

go
mySlice2 = 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 بدون الحاجة للفهرسة الإضافية. إليك تعديل للبرنامج:

go
package 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.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!