Pysolate Spine中文旁白 + HTML 图解全部小课 ↗

知识小点 · 解开一个疑问

Go defer:闭包读取的是哪个时刻的 x?

把 defer 的参数求值和闭包捕获放在同一个函数里,看清登记顺序、读取时机与返回前的后进先出。

01 / 05

先把两种 defer 放在一起

同一个 x,不同的读取时机

准备播放
Go
DEFER CAPTURE登记时保存 vs 执行时读取
先看完整代码
RUNNABLE CODE完整例子 · demo 的返回收尾
执行第 5–6 行

          
          package main
        
          
          
        
          
          import "fmt"
        
          
          
        
          
          func demo() {
        
          
              x := 1
        
          
              defer fmt.Println("argument", x)
        
          
              defer func() {
        
          
                  fmt.Println("closure", x)
        
          
              }()
        
          
              x = 2
        
          
              return
        
          
          }
        
          
          
        
          
          func main() {
        
          
              demo()
        
          
          }
        
这是可直接运行的完整示例。
CURRENT STEP同一个 x,两种读取方式
进入函数,x 先是 1
x := 1
OUTER VALUEx1变量当前值
DIRECT ARGUMENTargument等待登记登记时读取 x
CLOSURE READclosure尚未读取执行时读取外层 x
DEFER STACK待执行清单
顶 → 底

还没有登记项目

OUTPUT实际输出
发生顺序

还没有输出

先登记两条 defer,真正执行要等 demo 返回。

旁白

点一下播放即可。也可以只听声音,或拖动进度跳到想看的位置。

0:001:15

正在准备本课音轨与图解。首次播放需要点一下。

跳到某一节 / 查看讲稿