علل ومشكلات

استدعاءات recover في أجسام حلقات المرور على المُكرِّرات لا تعمل

وفق مواصفة Go، يطبع البرنامج التالي 123.


package main

import "fmt"

func main() {
	defer foo()
	panic(123)
}

func foo() {
	for range 1 {
		fmt.Println(recover()) // 123
	}
}

وبالمثل، ينبغي أن يطبع البرنامج التالي أيضًا 123. لكنه يطبع <nil> ثم ينهار (منذ إصدار سلسلة أدوات Go 1.23.0).


package main

import "fmt"

func main() {
	defer foo()
	panic(123)
}

func foo() {
	for range iter {
		fmt.Println(recover())
	}
}

func iter(yield func() bool) {
	yield()
}

(المسألة ذات الصلة: https://github.com/golang/go/issues/71685.)