我正在MicroMDM SCEP存储库https://github.com/micromdm/scep/blob/1e0c4b782f3f2e1e6f81da5f82444a6cedc89df3/cmd/scepclient/scepclient.go#L54-L65中阅读此源代码:
func run(cfg runCfg) error {
ctx := context.Background()
var logger log.Logger
{
if strings.ToLower(cfg.logfmt) == "json" {
logger = log.NewJSONLogger(os.Stderr)
} else {
logger = log.NewLogfmtLogger(os.Stderr)
}
stdlog.SetOutput(log.NewStdlibAdapter(logger))
logger = log.With(logger, "ts", log.DefaultTimestampUTC)
if !cfg.debug {
logger = level.NewFilter(logger, level.AllowInfo())
}
}
lginfo := level.Info(logger)
Run Code Online (Sandbox Code Playgroud)
我想知道显式块(外部{ ... })的目的是什么?此代码与删除时的代码是否完全相同,例如
func run(cfg runCfg) error {
ctx := context.Background()
var logger log.Logger
if strings.ToLower(cfg.logfmt) == "json" {
logger = log.NewJSONLogger(os.Stderr)
} else {
logger = log.NewLogfmtLogger(os.Stderr)
}
stdlog.SetOutput(log.NewStdlibAdapter(logger))
logger = log.With(logger, "ts", log.DefaultTimestampUTC)
if !cfg.debug {
logger = level.NewFilter(logger, level.AllowInfo())
}
lginfo := level.Info(logger)
Run Code Online (Sandbox Code Playgroud)
也许明确的限制仅仅是为了提高可读性?
在这种情况下,多余的块似乎毫无用处。块内未声明任何变量。它并没有增加清晰度,反而使您感到困惑。
如果需要清晰度,则可以将该代码提取到新函数中以初始化记录器。
func initLogger(cfg runCfg) log.Logger {
var logger log.Logger
if strings.ToLower(cfg.logfmt) == "json" {
logger = log.NewJSONLogger(os.Stderr)
} else {
logger = log.NewLogfmtLogger(os.Stderr)
}
stdlog.SetOutput(log.NewStdlibAdapter(logger))
logger = log.With(logger, "ts", log.DefaultTimestampUTC)
if !cfg.debug {
logger = level.NewFilter(logger, level.AllowInfo())
}
return logger
}
func run(cfg runCfg) error {
ctx := context.Background()
logger := initLogger(cfg)
lginfo := level.Info(logger)
...
Run Code Online (Sandbox Code Playgroud)
我最好的猜测是,该块在过去曾达到某种目的,而更改代码的人并未将其删除,也可能不确定是否仍然达到了目的。浏览此功能的非常规日志可能会给您答案。