ماذا يطبع البرنامج التالي؟
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], " ")
}