这些行代码在Go语言中是相同的吗?

huangapple go评论77阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2022年8月29日 15:06:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/73525208.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定