Golang Go语言中关于 defer 的案例有点不太理解(新手)

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

在看 defer 案例的时候看到这题有点不太理解,为什么后两句会输出 nil ? 是因为这个 err 只能使用一次嘛?

jOXc3n.png


Golang Go语言中关于 defer 的案例有点不太理解(新手)

更多关于Golang Go语言中关于 defer 的案例有点不太理解(新手)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

前面两个在 defer 注册的时候,err 的值已经固定了,第一个不用说了,第二个也捕获了当时为 nil 的 err ,只有最后一个能拿到 return 时的外层的 err 。
闭包那块的东西。

更多关于Golang Go语言中关于 defer 的案例有点不太理解(新手)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


那是不是可以这么理解,就是在使用 defer 的时候,里面就已经确定了对应类型的零值了。而因为第三条语句是闭包所以能逐层向外寻找 err 值

#2 不是存了 0 值,是存了注册时变量对应的值

感谢,现在理解了

前两句,值已经确定了

学习下闭包吧 这概念各种语言里面都有。以前我记得面试 js 的时候必问闭包…

完全没有编程基础,都说 Go 挺火的,就下班之后学习下,所以学习的时候有些地方会卡壳。。

别着急。你这入门肯定会比较慢,耐下心来,过几年会有效果的。我刚开始学的时候连 i=i+1 都死活看不懂

感谢,我也顺便巩固了一下

前面两个 err 是传进去的,最后一个是现取的

defer 把一个调用函数压入栈,随后在函数 return 执行时先进后出地执行.
如果函数的参数存在未确定的值,就会先确定函数参数值,再将整个语句存入 defer 的调用栈.

在这个题目:
最后一个使用函数没有参数,所以没用确定一个固定的参数传入.前两行的函数需要函数参数,所以会去寻找一个固定值.

你好,作为Go语言的新手,对defer关键字的理解确实是一个重要的学习步骤。defer是Go语言中的一个延迟执行语句,它会在包含它的函数即将返回时执行。这个功能在资源清理、文件关闭、解锁互斥锁等场景中非常有用。

下面是一个简单的例子,帮助你理解defer的用法:

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Start")
    defer fmt.Println("Deferred")
    fmt.Println("End")
}

在这个例子中,虽然defer语句在fmt.Println("End")之前,但它会在main函数返回前执行,因此输出会是:

Start
End
Deferred

这个顺序展示了defer的延迟执行特性。在实际应用中,你可以利用这个特性确保资源被正确释放,比如:

func readFile(filename string) {
    file, err := os.Open(filename)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close() // 确保文件在函数返回前被关闭
    // 读取文件内容...
}

在这个readFile函数中,无论后续代码是否发生错误,defer file.Close()都会确保文件被正确关闭。希望这些例子能帮助你更好地理解defer的用法。如果你有任何进一步的问题或需要更复杂的示例,请随时提问。

回到顶部