package main import "fmt" func Test() (int) { ret := 123 defer func() { fmt.Println("first defer:",ret) }() defer func() { ret++ fmt.Println("Inner:", ret) }() return ret } func main() { fmt.Println(Test()) } 打印結果是123
package main import "fmt" func Test() (ret int) { ret = 123 defer func() { fmt.Println("first defer:",ret) }() defer func() { ret++ fmt.Println("Inner:", ret) }() return ret } func main() { fmt.Println(Test()) } 打印結果是124
前者123, 後者124? 怎麼理解!html
Go的return語句不是原子指令! 底層被分解爲:git
1. 返回值=xxx 2. 調用defer函數 3. 空的return
其實這種理解也是錯的!golang
根據Go的內存模型及調用協議:函數
方法幀(frame): 返回值0 返回值1 ... 實參0 實參1 ...
從這個層面理解, return語句也是原子指令.code
但也能夠看出, 命名返回值某種程度節省了賦值指令.htm