gpt4 book ai didi

go - 当资源超过周围函数的范围时,如何推迟资源清理?

转载 作者:行者123 更新时间:2023-12-04 11:58:25 28 4
gpt4 key购买 nike

我们以this piece of code为例这使得记录器写入本地文件而不是标准输出:

f, err := os.OpenFile("filename", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}

defer f.Close()

log.SetOutput(f)
作者把这段代码直接放进了 main()功能,使其按预期工作。但是如果我想把这段代码放到一个专用的函数里面 main()可能然后调用,那么它将不再起作用,因为 f.Close()将在记录器被使用之前被调用。
例如。 (如果上面的代码现在在一个名为 logToFile() 的函数中):
main() {
logToFile()
log.Print("I'm going to end up in stdout\n")
}
可以这被移动到它自己的功能中,并且仍然按预期工作?
我在打开/关闭数据库连接时遇到过同样的情况。似乎唯一的方法就是在 main() 中做这两件事。 ,但我认为如果我们将其划分为功能,代码会看起来更清晰,更多的 SoC。这是 Go 中的禁忌吗?

最佳答案

你在寻找这样的东西吗?

type closerFunc func() error

func logToFile(path string) closerFunc {
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}

log.SetOutput(f)

return func() error {
return f.Close()
}
}
使用:
func main() {
closerFn := logToFile("filename")
defer closerFn()

log.Print("logs to file\n")
}

关于go - 当资源超过周围函数的范围时,如何推迟资源清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68693616/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com