写点尺度的 Go 代码,你学会了吗?

发布日期:2022-08-06 20:07    点击次数:158

本文转载自微信群众号「Golang技能分享」,作者古板铃砍菜刀。转载本文请联络Golang技能分享群众号。

在公司举行代码开发,普通都市拟订一套编程尺度。杰出的代码尺度可以或许改良名目可读性,行进团队开发的合作效劳。具体在 Go 言语中,我们可以或许自创 Go 平易近间的 Go Code Review Co妹妹ents、Uber 开源的 uber-go/guide 名目,巨匠感兴致可以或许去深造。

本文我们聚焦于一个点:Go 的 error 鉴定。

启迪代码

我们间接看一段代码

type MyselfError struct{}  func (m *MyselfError) Error() string {  return "完成 error 接口的 Error 编制" }  func someWork() *MyselfError {  return nil }  func main() {  var err error  err = someWork()  fmt.Println(err == nil) }  // output: false 

这个例子的输出大略会让你认为意外?

这是由于在 Go 中,两个 nil 的相比大略着实不相称。在Go 言语范例可比性一文中我们说过:关于接口 interface 而言,它的相比存在两个维度,划分是静态范例和静态值。接口的==相比,只要在范例与值均相称的环境下才会为真。

type error interface {     Error() string } 

someWork函数前去的 err 它是范例为 MyselfError,值为 nil 的 error 接口,显明不餍足哀告:只要范例和值同时都为 nil 的环境下,接口范例的 nil 鉴定才会为真。

主分支代码

有了上面的铺垫,你该当懂我要说什么了吧?

在 Go 中,不要经由过程err == nil来做逻辑鉴定条件。这不然而由于运用它会孕育发生潜伏的 bug,这样的代码交于测试童鞋,他们大略也会喷你,你晓得是为何吗?

我们可以或许把代码分为主干代码和分支代码,主干代码代表畸形逻辑,分支代码记载很是case。两者最俭朴的判别编制就是:在一个函数中,劳务派遣主干代码与最左边只隔一个 tab 距离,逾越一个 tab 距离的为分支代码。

在处理惩罚舛误前去的函数中,我们该领先做舛误很是的处理惩罚,舛误处理惩罚的逻辑属于分支代码,而畸形逻辑则应在主干代码上。

舛误示例
func bar() {  var err error  err = foo()  if err == nil {   // 顺序畸形的代码逻辑  } else {   switch err.(type) {   case err1:    // 做舛误处理惩罚1   case err2:    // 做舛误处理惩罚2   default:    // 做通用舛误处理惩罚   }  } } 

今朝你能晓得测试童鞋为何喷你吗?

有一个词叫做测试笼盖率,它代表测试用例走过的代码行数。假定你将err==nil的鉴定前置,那这段代码就关于测试不敌对。

在测试进程中,偶尔我们很难工钱布局舛误的发生,那末很大略测试用例只会走err==nil上面的代码逻辑。

尺度示例
func main() {  var err error  err = foo()  if err != nil {   switch err.(type) {   case err1:    // 做舛误处理惩罚1   case err2:    // 做舛误处理惩罚2   default:    // 做通用舛误处理惩罚   }  }  // 顺序畸形的代码逻辑 } 

这样的代码尺度,让我们在初次接手新名目,或许 code review 其余人的代码时,大略经由过程浏览主干代码而倏天文解地代码业务逻辑,而不至于陷入琐碎的 case 处理惩罚中。

总结

来日诰日的文章诚然很短,然则停留能给巨匠带来启迪。

在 Go 中 err == nil 不需求鉴定,而该鉴定很是 case,畸形逻辑置于主干,很是代码置于分支。

在开发组内直立起一套杰出的代码尺度,会有助于提升代码可读性以及事变合作效劳。假定你们尚未近似的尺度,那就去参考 Go Code Review Co妹妹ents、 uber-go/guide 来整活一套?

参考

Go Code Review Co妹妹ents:https://github.com/golang/go/wiki/CodeReviewCo妹妹ents

 

uber-go/guide:https://github.com/uber-go/guide

 



相关资讯