Golang Go语言中 defer 的位置

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

今天在看代码的时候,给已有代码添加 defer ,但是加上代码确实难看,所以突发奇想就把 defer 放在了定义的后面,如下。不知道写这里是否合适

ctx, cancel := context.WithTimeout(); defer cancel()

Golang Go语言中 defer 的位置
7 回复

好吧,go fmt 自动给我换行了😂😂

更多关于Golang Go语言中 defer 的位置的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


gofmt 直接避免类似 c 语言{在行尾还是新起一行这种无意义争议的事情

我还以为你是问 defer 是不是放 err!=nil 后面,没想到你甚至都没保存。

vscode 设置保存后格式化,你基本不会问这个问题。

这个其实无所谓,看习惯了就好。go 的哲学跟其他语言还是有一定区别的,上手得熟悉一段时间

个人其实更喜欢 C++那套 RAII 的玩意儿,由库作者负责保证资源的安全释放。go 虽然不太用这种不过 defer 也不失为一种好方法,至少比到处塞满 if 要好很多

一顿随便写,之后 gofmt -s -w . 板板正正的

在Golang(Go语言)中,defer语句的位置对于理解其执行时机至关重要。defer用于延迟一个函数或方法的执行,直到包含该defer语句的函数即将返回时才执行。这种机制常用于资源清理、文件关闭、解锁互斥锁等场景。

在函数体内,defer语句可以出现在任何位置,但其执行顺序是后进先出(LIFO,Last In First Out)的栈式行为。也就是说,后添加的defer会先执行,先添加的会后执行。这种特性使得在函数的多处位置添加defer时,能够确保资源按照逆序被释放或操作被撤销。

例如:

func example() {
    defer fmt.Println("First defer")
    defer fmt.Println("Second defer")
    fmt.Println("Executing function")
}

输出将会是:

Executing function
Second defer
First defer

这种机制确保了即使在发生错误或提前返回的情况下,资源也能被正确释放。因此,在编写Go代码时,合理利用defer可以极大地提高代码的健壮性和可读性。

总之,defer语句的位置虽然灵活,但其执行顺序遵循栈的原则,需要开发者在设计代码时充分考虑这一点,以确保资源管理的正确性和效率。在实际开发中,建议将defer语句放在函数开始处或紧接在使用完资源之后,以清晰表达资源的生命周期管理意图。

回到顶部