另外虽然是 rewrite 为 function 来实现,但是在 range loop 中调用 defer 也是和普通的 loop 相同,即在包含该 loop 的 function 结束时执行。
例如下面这个例子:
package mainimport ( "fmt" "iter")func DeferAfterYield() iter.Seq[int] { defer fmt.Println("defer before range function") return func(yield func(int) bool) { defer fmt.Println("defer in range function") for i := 0; i < 3; i++ { yield(i) } }}func main() { for x := range DeferAfterYield() { defer func() { fmt.Println("defer in main loop: ", x) }() fmt.Println(x) } fmt.Println("other operation in main") defer func() { fmt.Println("defer in main") }()}
其运行的结果为
defer before range function012defer in range functionother operation in maindefer in maindefer in main loop: 2defer in main loop: 1defer in main loop: 0
通过这个例子可以发现:
defer in range function 会在 loop 结束时调用
defer in main loop 是在 main 函数结束时调用,同一般 loop 中使用 defer
变量 x 在每次循环中会生成新的,闭包函数可正常的捕获,不再需要想以前需要使用 var x1 := x 来捕获,这个不是 rangefunc 中提供的功能,而是新版本的 golang 修改的,这里只是提醒一下