Go 中不那么冗长的错误处理?

Posted

技术标签:

【中文标题】Go 中不那么冗长的错误处理?【英文标题】:Less verbose error handling in Go? 【发布时间】:2018-04-23 19:13:06 【问题描述】:

我有一些使用“database/sql”包查询数据库的 Go 代码。这些函数中的大多数返回:result, errrows, err

因此,您最终会得到许多这样的重复块:

if err != nil 
  // Handle Error

我已经看到只返回错误的函数的“更简洁”代码:

if err := SomeFunc(); err != nil 
  // Handle Error

我不能对这些函数执行此操作,因为当我稍后需要在另一个查询函数中访问它时,变量会被困在范围内。

有没有办法清理这个 go 代码?

【问题讨论】:

Tangential:如果使用sqlx,则可以使用Get() 和Select() 分别拉取单个条目或一组条目,而无需处理rows 变量。这些函数只返回一个错误,因此可以很好地与if <statement>; <conditional> 样式配合使用。总的来说,sqlx 也是一个非常棒的库。 Handling multiple errors in go的可能重复 【参考方案1】:

只有在使用:=if 块中声明它们时,它们才会被困在范围内。如果您在if 之外声明它们,则它们在外部范围内:

var err error
var result SomeResultType
if result,err = SomeFunc(); err != nil 
    // Handle error

// Do something with result (or error if you want)

【讨论】:

虽然在这种情况下,简单地将函数调用移到 if 语句之外(并使用简写声明)实际上是一种更紧凑的代码风格。将语句移动到 if 块时,预先声明 vars 添加了 2 行保存了 1 行。但是,如果由于某种原因已经声明了变量,或者如果您使用命名返回,则可以很好地工作。 无论哪种方式,都具有将声明移到块外的相同效果。

以上是关于Go 中不那么冗长的错误处理?的主要内容,如果未能解决你的问题,请参考以下文章

深入Go的错误处理机制使用

Go错误处理

爆肝3天只为Golang 错误处理最佳实践

爆肝3天只为Golang 错误处理最佳实践

爆肝3天只为Golang 错误处理最佳实践

Atitit.异常处理 嵌套  冗长的解决方案