首页 > 解决方案 > Logger.Writer.(*os.File) (左侧的非接口类型 func() io.Writer)

问题描述

初始化记录器后:

var Logger *log.Logger

f, err := os.OpenFile("somefile", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
Logger = log.New(f, "prefix: ", log.LstdFlags)

我想关闭记录器的目标文件:

func main() {
    // Close log writer on exit
    defer func(){
        if file, ok := Logger.Writer.(*os.File); ok {
            file.Sync()
            file.Close()
        } else if handler, ok := Logger.Writer.(io.Closer); ok {
            handler.Close()
        }
    }()

    // ...
}

但是Logger.Writer.(*os.File)语法给出了错误:

 invalid type assertion: Logger.Writer.(*os.File) (non-interface type func() io.Writer on left)

如何关闭记录器的目标文件?

标签: gologging

解决方案


该错误几乎为您说明了这一点:Logger.Writer是一种方法Logger,而不是字段:

func (l *Logger) Writer() io.Writer

io.Writer它返回给定的原始文件log.New

您正在尝试将函数 Logger.Writer转换为 a *os.File(然后转换为 a io.Closer)。相反,您需要转换返回值:

...
if file, ok := Logger.Writer().(*os.File); ok {
  ...
} else if handler, ok := Logger.Writer().(io.Closer); ok {
...

推荐阅读