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 關注
- 95 瀏覽
添加回答
舉報