为了账号安全,请及时绑定邮箱和手机立即绑定

戈朗。帮助优化一段代码

戈朗。帮助优化一段代码

Go
繁花如伊 2022-03-07 12:52:09
我有代码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)}缩短它的好方法是什么?我不想重复相同的非常相似的块 4 次。如何使它成为一个循环?我尝试使用文件名和记录器对象创建地图,但不知道如何正确发布参考
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

这就是我最终做到的


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)

    }

}


查看完整回答
反对 回复 2022-03-07
?
jeck猫

TA贡献1909条经验 获得超7个赞

这样的事情可能会起作用(您可能需要调整界面中的函数类型或完全删除界面):


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)

    }

}


查看完整回答
反对 回复 2022-03-07
  • 2 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信