如何消除全局变量

时间:2018-07-22 20:09:26

标签: debugging variables go

我才刚刚开始学习,在任何地方都提到建议最佳实践,以避免使用全局变量。我有这段代码:

package main

const scriptVersion = "1.1"
var debug = 0

func logHandler(t, e string) {
    switch t {
    case "warning":
        fmt.Println("WARNING |", e)
    case "error":
        fmt.Println("ERROR   |", e)
        os.Exit("1")
    case "debug":
        if debug == 1 {
            fmt.Println("DEBUG   |", e)
        }
    default:
        fmt.Println("INFO    |", e)
    }
}

for userOptsValue := range os.Args { {
        switch userOptsValue {
        case "-d", "--debug":
            d := &debug
            *d = 1
            logHandler("debug", "Debug Enabled")
        case "-v", "--version":
            logHandler("info", "Version "+scriptVersion)
        default:
            logHandler("warning", "Unknown Option "+userOptsValue+","+" ignoring")
        }
    }

这个想法是通过使用-d或--debug参数调用脚本来激活脚本中的调试操作。我该如何做,但要避免使用全局变量“ var debug = 0”?

1 个答案:

答案 0 :(得分:2)

如果调试标志仅影响您的日志记录,请创建一个

type logger struct {
    debug bool
}

它将捕获该状态,然后使您的logHandler成为该类型的方法log(...)

这留下了在哪里创建logger实例的问题。在整个程序中普遍存在的特定日志记录情况下,我可以想到两种可能性:

1)使用全局日志变量/函数,即在程序开始处创建一个logger,然后在任何地方全局使用。这意味着您可以将其放在自己的log包中,例如内置的package log(顺便说一下,您也可以使用它,但我看到您经常需要其他东西来记录日志)。

2)再次,有一个logger实例,但不要使其全局可用,而是将其传递到使用它的所有位置。在您的主目录中创建它,并将其传递给需要使用它的子模块。这高度依赖于您的代码组织,有时很容易做到,有时却不容易。在某些情况下,选项1)可能更适合您。