Go中明确作用域块的目的?

Kur*_*eek -1 go lexical-scope

我正在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)

也许明确的限制仅仅是为了提高可读性?

Sch*_*ern 5

在这种情况下,多余的块似乎毫无用处。块内未声明任何变量。它并没有增加清晰度,反而使您感到困惑。

如果需要清晰度,则可以将该代码提取到新函数中以初始化记录器。

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)

我最好的猜测是,该块在过去曾达到某种目的,而更改代码的人并未将其删除,也可能不确定是否仍然达到了目的。浏览此功能的非常规日志可能会给您答案。