我看到下面的代码(我把它简化了一点)。
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{...}里面吗?有什么办法这样做吗?我是不是遗漏了什么?
发布于 2017-07-04 06:55:40
添加一个新的块将创建一个新的变量范围,并且在该块中声明的变量将不可在该块之外使用:
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()
}有些人认为这是“良好的卫生”。就我个人而言,我认为这不值得降低可读性。
https://stackoverflow.com/questions/44898833
复制相似问题