2 回答

TA贡献2051条经验 获得超10个赞
你在寻找这样的东西吗?
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")
}

TA贡献1848条经验 获得超2个赞
一种选择是使用延续传递样式,将要在块内执行的代码作为显式参数传递:defer
func withLogToFile(filename string, body func()) {
f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}
prevOut := log.Writer()
log.SetOutput(f)
defer func() {
log.SetOutput(prevOut)
if err := f.Close(); err != nil {
log.Fatal(err)
}
}()
body()
}
然后呼叫站点变为:
func main() {
withLogToFile(filename, func() {
log.Print("I'm going to end up in ", filename)
})
}
(https://play.golang.org/p/ebCvtzufU5U)
- 2 回答
- 0 关注
- 76 浏览
添加回答
举报