Golang Go语言中大佬们帮我看看这个 defer 的问题呗

发布于 1周前 作者 bupafengyu 来自 Go语言

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

9 回复

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 楼

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最常见的用途包括:

  1. 资源释放:在文件操作、数据库连接等场景中,使用defer确保资源在函数结束时被正确释放。

  2. 解锁互斥锁:在涉及并发编程时,使用defer来确保互斥锁在函数结束时被解锁,防止死锁。

  3. 打印日志或调试信息:在函数开始或结束时记录日志,有助于调试和跟踪。

使用defer时需要注意的几点:

  • defer语句中的函数参数在defer语句执行时就会确定,而不是在defer的函数实际被调用时。
  • 多个defer语句会以栈的形式执行,即后定义的defer会先执行。
  • 在错误处理中,defer可以用于清理资源,即使函数因为错误提前返回。

如果你能具体描述一下你遇到的defer问题,比如代码示例、错误消息或者期望的行为与实际不符的地方,我可以给出更精确的帮助。在没有具体上下文的情况下,上述概述应该能帮助你更好地理解defer的用法和注意事项。

回到顶部