鍍金池/ 問答/GO/ defer + 函數(shù)語句 是如何運(yùn)行的?

defer + 函數(shù)語句 是如何運(yùn)行的?

package main

import (
    "io"
    "log"
)

func func1(s string) (n int, err error) {
    defer func() {
        log.Printf("func1(%q) = %d, %v", s, n, err)
    }()
    return 7, io.EOF
}

func main() {
    func1("Go")
}

輸出: Output: 2011/10/04 10:46:11 func1("Go") = 7, EOF

defer 不是應(yīng)該在return之前調(diào)用么,這里怎么進(jìn)行傳參的?

回答
編輯回答
故林

return不是一條原子指令,它可以拆分成以下三步.

  1. 給返回值賦值
  2. 執(zhí)行defer后的函數(shù)
  3. return 空
2018年7月23日 22:03
編輯回答
擱淺

相當(dāng)于:

package main

import (

"io"
"log"

)

func func1(s string) (n int, err error) {

n = 7
err = io.EOF

func() {
    log.Printf("func1(%q) = %d, %v", s, n, err)
}()

return

}

func main() {

func1("Go")

}

2018年3月23日 23:12