Go 中不那么冗长的错误处理?
Posted
技术标签:
【中文标题】Go 中不那么冗长的错误处理?【英文标题】:Less verbose error handling in Go? 【发布时间】:2018-04-23 19:13:06 【问题描述】:我有一些使用“database/sql”包查询数据库的 Go 代码。这些函数中的大多数返回:result, err
或 rows, 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 中不那么冗长的错误处理?的主要内容,如果未能解决你的问题,请参考以下文章