Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 如何消除全局变量_Debugging_Variables_Go - Fatal编程技术网

Debugging 如何消除全局变量

Debugging 如何消除全局变量,debugging,variables,go,Debugging,Variables,Go,我刚刚开始学习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

我刚刚开始学习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”

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

type logger struct {
    debug bool
}
它捕获该状态,然后使您的
logHandler
成为该类型的方法
log(…)

这就留下了在何处创建
记录器的实例的问题。在整个程序中经常无处不在的日志记录的特定情况下,我可以想到两种可能性:

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


2) 同样,拥有一个
logger
实例,但不要让它在全球范围内可用,而是将它传递到所有需要使用它的地方。在主模块中创建它,并将其传递给需要使用它的子模块。这在很大程度上取决于您的代码组织,有时很容易做到,有时则不然。在某些情况下,选项1)可能更适合您。

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

type logger struct {
    debug bool
}
它捕获该状态,然后使您的
logHandler
成为该类型的方法
log(…)

这就留下了在何处创建
记录器的实例的问题。在整个程序中经常无处不在的日志记录的特定情况下,我可以想到两种可能性:

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

2) 同样,拥有一个
logger
实例,但不要让它在全球范围内可用,而是将它传递到所有需要使用它的地方。在主模块中创建它,并将其传递给需要使用它的子模块。这在很大程度上取决于您的代码组织,有时很容易做到,有时则不然。在某些情况下,选项1)可能更适合您