defer 后的语句/函数,会在当前函数return 后,返回前执行、
示例1
package main
import (
"fmt"
)
func main() {
defer fmt.Println("1")
fmt.Println("2")
}
执行结果:
2
1
示例2
后 defer 的先执行。
package main
import (
"fmt"
)
func main() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
defer fmt.Println("4")
}
执行结果:
4
3
2
1
示例3
package main
import (
"fmt"
)
func main() {
defer fmt.Println("1")
defer fmt.Println("2")
defer func() {
defer fmt.Println("a")
defer fmt.Println("b")
}()
defer fmt.Println("3")
defer fmt.Println("4")
}
执行结果:
4
3
b
a
2
1
示例4
如果有命名返回值,defer 可以修改返回值。
package main
import "fmt"
func test() (result int) { // 返回值命名为 result
result = 1
defer func() {
result += 1
}()
return result
}
func main() {
fmt.Println(test())
}
执行结果:
2
如果不是命名返回值,对于值类型,不会修改:
package main
import "fmt"
func test() int {
result := 1
defer func() {
result += 1
}()
return result
}
func main() {
fmt.Println(test())
}
执行结果:
1
对于指针类型,则会有修改效果:
package main
import "fmt"
func test() *int {
result := 1
defer func() {
result +=1
}()
return &result
}
func main() {
fmt.Println(*test())
}
执行结果:
2
示例5
defer 必须出现在 return 之前,否则不会生效
package main
import "fmt"
func main() {
defer fmt.Println(1)
return
defer fmt.Println(2)
}
执行结果:
1