اختبارات

حلقة 1

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


package main

func main() {
	x := []int{7, 8, 9}
	y := [3]*int{}
	for i, v := range x {
		defer func() {
			print(v)
		}()
		y[i] = &i
	}
	print(*y[0], *y[1], *y[2], " ")
}

الخيارات:

  • 012 789
  • 012 987
  • 222 789
  • 222 999

الإجابة: 222 999 (قبل Go 1.22)، 012 987 (منذ Go 1.22)

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

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

  • قبل Go 1.22، كانت متغيرات التكرار (وهي هنا i وv) مشتركة بين جميع خطوات الحلقة. بعبارة أخرى، لم يكن لكل متغير تكرار سوى نسخة واحدة أثناء تنفيذ الحلقة. وهذا يعني أن جميع عناصر y تخزّن العنوان نفسه (الخاص بالقيمة v). وفي النهاية، تُضبط المتغيرة i على 2، وتُضبط المتغيرة v على 9.

إذن، قبل Go 1.22، يكون الناتج 222 999.

  • منذ Go 1.22، تحصل متغيرات التكرار (وهي هنا i وv) على نسخ جديدة في كل خطوة من خطوات الحلقة. لذا، منذ Go 1.22، يكون الناتج 222 999.

وبخلاف البرنامج أعلاه، يطبع البرنامج التالي دائمًا 012 987، سواء قبل Go 1.22 أو منذها.


package main

func main() {
	x := []int{7, 8, 9}
	y := [3]*int{}
	for i, v := range x {
		defer print(v)

		i := i
		y[i] = &i
	}
	print(*y[0], *y[1], *y[2], " ")
}