为了账号安全,请及时绑定邮箱和手机立即绑定

是否应该将 return err 放入带有声明的 if 语句的 else 中,或者避免这种风格并超出

是否应该将 return err 放入带有声明的 if 语句的 else 中,或者避免这种风格并超出

Go
哈士奇WWW 2022-10-24 09:10:23
在 Go 中,我们经常在语句中编写带有声明的代码,if并且return err. 像这样:    if res, err := getResult(); err != nil {        return err    } else {        fmt.Println(res)        // do something with res    }但是 linter 总是告诉我应该在else之后删除块return:  ⚠  https://revive.run/r#indent-error-flow  if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)代码片段应如下所示以满足建议:    res, err := getResult()    if err != nil {        return err    }    fmt.Println(res)    // do something with res看来我们应该避免在语句中使用if声明。那么正确的 Go 风格是什么?我应该如何处理声明中的if声明?
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

Effective Go 中about 部分if对此提供了一些指导:

如果成功的控制流顺着页面向下运行,则代码可读性很好,从而消除了出现的错误情况。由于错误情况往往以return语句结尾,因此生成的代码不需要else语句。


f, err := os.Open(name)

if err != nil {

  return err

}

d, err := f.Stat()

if err != nil {

  f.Close()

  return err

}

codeUsing(f, d)

如果你坚持这种风格,并且如果你打算error在你的“幸福路径”中使用非结果,那么你根本不能在简单语句中将函数的结果声明为变量,可以if在语句的条件之前;您别无选择,只能将该变量声明放在if. 但是,如果函数只返回一个error(或者您不关心它的其他结果),您可以自由地将变量声明放在if:


// within some HTTP handler

var u User

dec := json.NewDecoder(w)

if err := dec.Decode(&u) {

   w.WriteHeader(http.StatusBadRequest)

   return

}

// use u


查看完整回答
反对 回复 2022-10-24
?
holdtom

TA贡献1805条经验 获得超10个赞

你可以查看官方的 GO 流量控制教程:https ://go.dev/tour/flowcontrol/7


func pow(x, n, lim float64) float64 {

if v := math.Pow(x, n); v < lim {

    return v

} else {

    fmt.Printf("%g >= %g\n", v, lim)

}

// can't use v here, though

return lim

}


查看完整回答
反对 回复 2022-10-24
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

从uber 的 go 风格指南代码应该尽可能减少嵌套。例如:


if a {

    return a

} else {

    return b

}

是一种糟糕的代码编写方式。这个不必要的 else 也应该被删除。


此外,如果您需要 if 块之后的变量,则无需使用 if 块声明它们。你可以阅读 uber 的 go style 文档,它会帮助你编写优雅的 go 代码。


分享

编辑

跟随


查看完整回答
反对 回复 2022-10-24
  • 3 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号