اختبارات

حلقة 2

ماذا يطبع البرنامج التالي؟


package main

func f() {
	var a = [2]int{5, 7}
	for i, v := range a {
		if i == 0 {
			a[1] = 9
		} else {
			print(v)
		}
	}
}

func g() {
	var a = [2]int{5, 7}
	for i, v := range a[:] {
		if i == 0 {
			a[1] = 9
		} else {
			print(v)
		}
	}
}

func main() {
	f()
	g()
}

الخيارات:

  • 77
  • 79
  • 97
  • 99

الإجابة: 79

شغِّله على Go play.

النقاط الأساسية:

  • عند التكرار على عناصر حاوية (مصفوفة/شريحة/خريطة)، فإن ما يُكرَّر عليه فعليًا هو عناصر نسخة من الحاوية.
  • المصفوفة تملك عناصرها. وعند نسخ مصفوفة، تُنسخ عناصرها أيضًا. وتعديل العناصر في مصفوفة لا يؤثر على العناصر في نسخة المصفوفة.
  • الشريحة تشير إلى عناصرها فقط. وعند نسخ شريحة (عبر الإسناد، لا باستدعاء الدالة المضمّنة copy)، لا تُنسخ عناصرها. وبعد النسخ، تتشارك نسخة الشريحة العناصر مع الشريحة الأصلية. لذا فإن تعديل العناصر في شريحة يعني تعديل العناصر في نسخة الشريحة.

لذا في الدالة f، لا يظهر تعديل a[1] في الحلقة. لكن تعديل a[1] في الدالة g يظهر في الحلقة.