注意:golang语言的新手
这是示例程序hello.go,我编写该程序是为了检查行为,并且看到的问题是,除了init()之外,其他任何函数都没有Logger编写任何东西。
package main
import (
"fmt"
"os"
"io"
"log"
)
var (
testLogger *log.Logger
)
func init() {
test_log := "/tmp/t1.log"
fmt.Printf("Logs are saved to %v\n", test_log)
f, err := os.OpenFile(test_log, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
if err != nil {
fmt.Printf("ERROR Can't create log file! Reason: %v \n", err)
os.Exit(1)
}
defer f.Close()
multiWriter := io.MultiWriter(f)
testLogger = log.New(multiWriter, "", log.Ldate|log.Ltime|log.Lshortfile)
testLogger.Printf("in init..")
}
func main() {
pretest()
test()
testLogger.Printf("Back to main ... ")
}
func pretest() {
testLogger.Printf("In pretest ... ")
}
func test() {
testLogger.Printf("in test..")
}
这是正在写入的文件的输出和内容:
➜./hello
日志保存到/tmp/t1.log
➜cat /tmp/t1.log
2018/06/28 11:23:25 hello.go:27:初始化..
AFAIK,在同一软件包中共享的testLogger应该可以被每个函数访问并能够使用。如果我的理解是错误的,请纠正我?我在代码中缺少任何内容吗?请提供有关此问题的任何指针或参考?谢谢。
答案 0 :(得分:4)
defer f.Close()
您正在defer
函数中执行init
,这意味着init
函数完成后,文件将立即关闭。
由于init
函数在main
之前运行,因此当您尝试从所有其他函数进行写入时,该文件将已经关闭。
将defer
移至主要功能,以便在程序退出时将其关闭。
请注意,在这种特定情况下,您甚至不需要关闭os.File
,因为默认情况下,当GC收集文件时,文件具有一个finalizer
可以自行关闭(请参阅{{1 }}的功能:https://golang.org/src/os/file_unix.go)。