Golang。帮助优化代码片段

时间:2016-08-27 08:29:03

标签: go

我有代码

if config.Process.TraceLog != "" {
    f, err := os.OpenFile(config.Process.TraceLog, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)

    if err != nil {
        fmt.Println("error opening log file: %v", err)
        os.Exit(1)
    }

    Trace.SetOutput(f)
}

if config.Process.InfoLog != "" {
    f, err := os.OpenFile(config.Process.InfoLog, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)

    if err != nil {
        fmt.Println("error opening log file: %v", err)
        os.Exit(1)
    }

    Info.SetOutput(f)
}
if config.Process.WarningLog != "" {
    f, err := os.OpenFile(config.Process.WarningLog, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)

    if err != nil {
        fmt.Println("error opening log file: %v", err)
        os.Exit(1)
    }
    Warning.SetOutput(f)
}

if config.Process.ErrorLog != "" {
    f, err := os.OpenFile(config.Process.ErrorLog, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)

    if err != nil {
        fmt.Println("error opening log file: %v", err)
        os.Exit(1)
    }

    Error.SetOutput(f)
}
  1. 缩短它的好方法是什么?我不想重复4次非常类似的阻止。

  2. 如何在循环中制作它?我尝试使用文件名和记录器对象创建地图,但不知道如何正确发布参考

2 个答案:

答案 0 :(得分:1)

这就是我最终做到的方式

m := map[string]*log.Logger{
    config.Process.TraceLog:   Trace,
    config.Process.InfoLog:    Info,
    config.Process.WarningLog: Warning,
    config.Process.ErrorLog:   Error,
}
for filepath, l := range m {
    if filepath != "" {
        f, err := os.OpenFile(filepath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)

        if err != nil {
            fmt.Println("error opening log file: %v", err)
            os.Exit(1)
        }
        l.SetOutput(f)
    }
}

答案 1 :(得分:0)

这样的东西可以工作(您可能需要调整界面中的函数类型或完全删除界面):

setLogIfNotEmpty(config.Process.TraceLog, Trace)
setLogIfNotEmpty(config.Process.InfoLog, Info)
setLogIfNotEmpty(config.Process.WarningLog, Warning)
setLogIfNotEmpty(config.Process.ErrorLog, Error)

interface SetOutputer {
    SetOutput(*os.File)
}

func setLogIfNotEmpty(file string, log SetOutputer) {
    if file != "" {
        f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)

        if err != nil {
            fmt.Println("error opening log file: %v", err)
            os.Exit(1)
        }

        log.SetOutput(f)
    }
}