Debugging 如何消除全局变量
我刚刚开始学习go,在任何地方都有人提到,对于最佳实践,建议避免使用全局变量。我有一段代码: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
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)可能更适合您