我才刚刚开始学习,在任何地方都提到建议最佳实践,以避免使用全局变量。我有这段代码:
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”?
答案 0 :(得分:2)
如果调试标志仅影响您的日志记录,请创建一个
type logger struct {
debug bool
}
它将捕获该状态,然后使您的logHandler
成为该类型的方法log(...)
。
这留下了在哪里创建logger
实例的问题。在整个程序中普遍存在的特定日志记录情况下,我可以想到两种可能性:
1)使用全局日志变量/函数,即在程序开始处创建一个logger
,然后在任何地方全局使用。这意味着您可以将其放在自己的log
包中,例如内置的package log(顺便说一下,您也可以使用它,但我看到您经常需要其他东西来记录日志)。
2)再次,有一个logger
实例,但不要使其全局可用,而是将其传递到使用它的所有位置。在您的主目录中创建它,并将其传递给需要使用它的子模块。这高度依赖于您的代码组织,有时很容易做到,有时却不容易。在某些情况下,选项1)可能更适合您。