gpt4 book ai didi

debugging - 如何消除全局变量

转载 作者:IT王子 更新时间:2023-10-29 02:37:15 26 4
gpt4 key购买 nike

我刚开始学习围棋,到处都提到建议最好避免使用全局变量。我有这段代码:

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(...)

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

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

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

关于debugging - 如何消除全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51468876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com