Golang Go语言中大佬们帮我看看这个 defer 的问题呗
Golang Go语言中大佬们帮我看看这个 defer 的问题呗
package main
import (
“fmt”
)
func main() {
fmt.Println(testRet())
}
func testRet() int {
var ret int
defer func() {
fmt.Println(“执行了 defer”)
ret++
}()
return ret
}
这段代码为什么返回的是 0 不是 1 ? 是我姿势不对么
更多关于Golang Go语言中大佬们帮我看看这个 defer 的问题呗的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
defer 在 return 之后
更多关于Golang Go语言中大佬们帮我看看这个 defer 的问题呗的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你去看看 defer 和 return 的顺序就搞明白了
要想返回 1,应该这么写
func testRet() (ret int) {
defer func() {
fmt.Println(“执行了 defer”)
ret++
}()
return
}
如果这样,就会返回 3
func testRet() (ret int) {
defer func() {
fmt.Println(“执行了 defer”)
ret++
}()
return 2
}
defer 是会执行,但是你 return 后面加了 ret,此时的 ret 是 0, 那你函数的返回值就已经定死,参考 2 楼
https://studygolang.com/articles/14831
https://blog.golang.org/defer-panic-and-recover
自己去看下哈 主要理解执行顺序 和 retvalue 含义
Deferred functions may read and assign to the returning function’s named return values.
named return values 强调
和加了 ret 没关系,这样也返回 1
func testRet() (ret int) {
defer func() {
fmt.Println(“执行了 defer”)
ret++
}()
return ret
}
OK,差点误导楼主。原来是 defer 操作对匿名返回值和命名返回值两种情况的处理不同导致的。
当然可以帮你解答关于Go语言中defer
的问题。defer
是Go语言中的一个关键字,用于延迟函数的执行直到包含该defer
语句的函数即将返回时。
defer
最常见的用途包括:
-
资源释放:在文件操作、数据库连接等场景中,使用
defer
确保资源在函数结束时被正确释放。 -
解锁互斥锁:在涉及并发编程时,使用
defer
来确保互斥锁在函数结束时被解锁,防止死锁。 -
打印日志或调试信息:在函数开始或结束时记录日志,有助于调试和跟踪。
使用defer
时需要注意的几点:
defer
语句中的函数参数在defer
语句执行时就会确定,而不是在defer
的函数实际被调用时。- 多个
defer
语句会以栈的形式执行,即后定义的defer
会先执行。 - 在错误处理中,
defer
可以用于清理资源,即使函数因为错误提前返回。
如果你能具体描述一下你遇到的defer
问题,比如代码示例、错误消息或者期望的行为与实际不符的地方,我可以给出更精确的帮助。在没有具体上下文的情况下,上述概述应该能帮助你更好地理解defer
的用法和注意事项。