让我们以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")
}
- this是否可以移动到它自己的函数中,并仍然按预期工作?
我在打开/关闭数据库连接时也遇到过同样的情况。看起来唯一的方法是在main()
内部完成这两件事,但我认为如果我们可以将代码划分为函数,代码看起来会更清晰,更像SoC。这是围棋中的禁忌吗
2条答案
按热度按时间dsf9zpds1#
你在找这样的东西吗?
用途:
t8e9dugd2#
一种选择是使用continuation-passing style,将在
defer
块中执行的代码作为显式参数传递:然后调用站点变为:
(https://play.golang.org/p/ebCvtzufU5U)