英文:
Are these line codes the same in golang?
问题
A和B是一样的吗?
A
if err := json.NewDecoder(r.Body).Decode(&t); err != nil {
rnd.JSON(w, http.StatusProcessing, err)
return
}
B
err := json.NewDecoder(r.Body).Decode(&t);
if err != nil {
rnd.JSON(w, http.StatusProcessing, err)
return
}
A和B是相同的代码,只是A使用了短变量声明(:=)来同时声明和赋值err变量。而B则是先声明err变量,再进行赋值操作。两者的功能和逻辑是完全一样的。
英文:
Is A same as B?
A
if err := json.NewDecoder(r.Body).Decode(&t); err != nil {
rnd.JSON(w, http.StatusProcessing, err)
return
}
B
err := json.NewDecoder(r.Body).Decode(&t);
if err != nil {
rnd.JSON(w, http.StatusProcessing, err)
return
}
答案1
得分: 6
它们是等价的,除了一个区别:err
变量的作用域不同。在 A 版本中,err
变量的作用域是 if
语句:在 if
之后无法访问。
在 B 版本中,err
变量在 if
语句之后仍然在作用域内,如果 err
在之前已经定义过,这可能导致编译时错误。
最佳实践是始终将变量的作用域最小化(这样可以减少误用的机会)。如果你在 if
之后不需要进一步检查返回的错误,那么使用 A 版本更好。如果你在 if
之后需要使用它,那么显然选择 B 版本。
英文:
They are equivalent except one difference: the scope of the err
variable. In the A version the scope of the err
variable is the if
statement: it's not accessible after the if
.
In the B version the err
variable will be in scope after the if
statement too, and if err
is already defined earlier, it could result in a compile-time error too.
It's good practice to always minimize the scope of variables (which gives you less chance to misuse them). If you do not wish to further examine the returned error after the if
, it's better to use the A version. If you do need it after the if
, then obviously the B version is the way to go.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论