(1)鞏固練習:
看看以下三個函數的返回值:
func f() (result int) {
defer func() {
result++
}()
return 0
}
func f() (r int) {
t := 5
defer func() {
t = t + 5
}()
return t
}
func f() (r int) {
defer func(r int) {
r = r + 5
}(r)
return 1
}
(2) 首先明確:defer在return之前執行
整個return過程:
1.沒有defer之前,先把在棧中寫一個值,這個值被會當作返回值。然後再調用RET指令返回。return xxx語句彙編後是先給返回值賦值,再做一個空的return: ( 賦值指令 + RET指令)
2.有defer之後,就變成了 (賦值指令 + CALL defer指令 + RET指令),將return語句分開成兩句寫,return xxx會被改寫成:
返回值 = xxx
調用defer函數
空的return
(3)分析
func f() (result int) {
result = 0 //return語句不是一條原子調用,return xxx其實是賦值+RET指令
func() { //defer被插入到return之前執行,也就是賦返回值和RET指令之間
result++
}()
return
}
返回值:1
func f() (r int) {
t := 5
r = t //賦值指令
func() { //defer被插入到賦值與返回之間執行,這個例子中返回值r沒被修改過
t = t + 5
}
return //空的return指令
}
返回值:5
func f() (r int) {
r = 1 //給返回值賦值
func(r int) { //這裏改的r是傳值傳進去的r,不會改變要返回的那個r值
r = r + 5
}(r)
return //空的return
}
返回值: 1