【问题标题】:Variable init in GoGo中的变量初始化
【发布时间】:2017-07-04 06:51:35
【问题描述】:

我看到以下代码(我简化了一点)。

func getEndpoints(db *sqlx.DB) s.Endpoints {
    var endpoints s.Endpoints
    {
        repository := acl.NewRepository(db)
        service := stat.NewService(repository)
        endpoints = s.Endpoints{
            GetEndpoint: s.MakeEndpoint(service),
        }
    }

    return endpoints 
}

如果我正确理解这段代码,var endpoints s.Endpoints{...} 内的代码将逐行执行,endpoints = s.Endpoints ... 行初始化上面声明的 var endpoints 变量。

我想这样重写是正确的(如果我错了请纠正我):

func getEndpoints(db *sqlx.DB) s.Endpoints {

    repository := acl.NewRepository(db)
    service := stat.NewService(repository)
    endpoints := s.Endpoints{
        GetEndpoint: s.MakeEndpoint(service),
    }

    return endpoints 
}

那么有人可以解释一下为什么初始化写在var endpoints s.Endpoints{...} 中。有什么想法可以这样做吗?我错过了什么吗?

【问题讨论】:

    标签: variables go scope initialization


    【解决方案1】:

    添加一个新块将创建一个新的变量作用域,并且在该块中声明的变量将在它之外不可用:

    var endpoints s.Endpoints
    {
        repository := acl.NewRepository(db)
        service := stat.NewService(repository)
        endpoints = s.Endpoints{
            GetEndpoint: s.MakeEndpoint(service),
        }
    }
    
    // service and repository  variables are not defined here!
    

    在您的具体简化示例中,它几乎没有意义,但如果您有其他具有相同变量的块,则更有意义。例如:

    var endpoints s.Endpoints
    {
        repository := acl.NewRepository(db)
        service := stat.NewService(repository)
        endpoints = s.Endpoints{
            GetEndpoint: s.MakeEndpoint(service),
        }
    }
    
     // Get another repository
    {
        repository := otherRepo.NewRepository(db)
        repository.DoSomething()
    }
    

    有些人认为这是“良好的卫生习惯”。就个人而言,我认为降低可读性是不值得的。

    【讨论】:

    • 这样的代码通常很好地表明您需要将函数一分为二。
    • 是的,它经常——尽管不一定总是——是@Schwern
    【解决方案2】:

    它们是等价的。

    {...} 块与var 关键字的变量声明无关。它只是碰巧一个接一个地写。

    {...} 是一个简单的block,仅此而已。 var 声明不需要那个块,即使有,它也与变量声明无关。您可以在要插入语句的任何位置插入块。

    使用显式块的罕见情况(当不需要时)是对语句进行分组,并控制其中声明的变量和其他标识符的范围,因为变量的范围在最里面的包含块的结尾 (Spec: Declarations and Scope)。

    【讨论】:

      猜你喜欢
      • 2016-05-28
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多