Go等同于C ++中的assert()?

Yix*_*Liu 9 go

我在Go中寻找条件检查,可以像C ++中的assert那样终止程序执行。

mae*_*ics 11

如评论者所述,go没有断言

go中可比较的替代方法是内置函数panic(...)该函数由条件控制:

if condition {
  panic(err)
}
Run Code Online (Sandbox Code Playgroud)

文章,题为“推迟,恐慌和恢复”也可能是内容丰富。

  • sry @RickyA,但这忽略了常规运行时错误和编程/逻辑错误之间的明显区别:Go中的panic()(如C等人的Assert)用于发信号通知何时遇到错误;您检查了绝对不能违反的不变量(因为代码应正确处理错误情况...),但是如果不变量已损坏,则发生错误。例如,访问切片时“索引必须在范围内”等。 (12认同)

Dan*_*son 5

我实际上使用了一个小助手:

func failIf(err error, msg string) {
  if err != nil {
    log.Fatalf("error " + msg + ": %v", err)
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在使用中:

db, err := sql.Open("mysql", "my_user@/my_database")
defer db.Close()
failIf(err, "connecting to my_database")
Run Code Online (Sandbox Code Playgroud)

失败时会生成:

连接到 my_database 时出错:<来自 MySQL/数据库的错误>