我有一些非常简单的代码,我将一些错误信息记录到文件中。package mainimport ( "log" "os")var testLogger *log.Loggerfunc init() { logFile, openErr1 := os.OpenFile("/home/doug/logs/test.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666) if openErr1 != nil { log.Println("Uh oh! Could not open log file.") } defer logFile.Close() testLogger = log.New(logFile, "PREFIX", log.Lshortfile|log.Ldate|log.Ltime)}func main() { testLogger.Println("meep meep")}但是,每当我在运行程序后打开文件时,它总是为空的。我究竟做错了什么?
1 回答
慕斯709654
TA贡献1840条经验 获得超5个赞
正如 Doug 已经指出的那样,该init()函数将始终在 之前调用main(),并且顺序如此。这意味着当init()完成时,队列中的defersinit()将执行,在这种情况下关闭你的日志。
在大多数情况下,您根本不打算打电话log.Close()。请注意,所有Fatal功能log都将os.Exit:
https://golang.org/src/log/log.go?s=9087:9131#L295
并且os.Exit明确说defers 的文档没有运行
// Exit causes the current program to exit with the given status code.
// Conventionally, code zero indicates success, non-zero an error.
// The program terminates immediately; deferred functions are not run.
func Exit(code int) {
因此,您可能会说标准库会log.Close()在发生致命错误时强制您不要这样做。有点暗示这没什么大不了的。
Panic但是请注意,函数将defer在退出之前运行红色函数。
- 1 回答
- 0 关注
- 191 浏览
添加回答
举报
0/150
提交
取消
