اختبارات

النطاق 2

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


package main

var f = func(x int) {}

func Bar() {
	f := func(x int) {
		if x >= 0 {
			print(x)
			f(x - 1)
		}
	}
	f(2)
}

func Foo() {
	f = func(x int) {
		if x >= 0 {
			print(x)
			f(x - 1)
		}
	}
	f(2)
}

func main() {
	Bar()
	print(" | ")
	Foo()
}

الخيارات:

  • 2 | 2
  • 2 | 210
  • 210 | 2
  • 210 | 210

الإجابة: 2 | 210

شغّله على Go play.

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

  • في الدالة Bar، المتغير f الثاني (ذاك الموجود في الاستدعاء f(x - 1)) هو المتغير f على مستوى الحزمة.
  • في الدالة Foo، جميع المتغيرات f الثلاثة هي المتغير f على مستوى الحزمة.

يُرجى قراءة كتل الشيفرة ونطاقات المعرّفات للحصول على شروحات أكثر تفصيلاً.