Go语言中与C++中的assert()等价的是什么?

lkaoscv7  于 12个月前  发布在  Go
关注(0)|答案(3)|浏览(77)

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

cyvaqqii

cyvaqqii1#

正如评论者所提到的,Go没有Assert。
Go语言中一个类似的替代方法是内置函数panic(...),由一个条件门控:

if condition {
  panic(err)
}

字符串
这个article titled "Defer, Panic, and Recover"也可能是信息性的。

vvppvyoh

vvppvyoh2#

其实我用了一个小帮手:

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

字符串
然后在用途:

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


失败时,它会生成:
错误连接到我的数据库:<错误从MySQL/数据库>

k4emjkb1

k4emjkb13#

我在测试中使用了这个通用的Go函数:

func assertEqual[T comparable](t *testing.T, expected T, actual T) {
    t.Helper()
    if expected == actual {
        return
    }
    t.Errorf("expected (%+v) is not equal to actual (%+v)", expected, actual)
}

func assertSliceEqual[T comparable](t *testing.T, expected []T, actual []T) {
    t.Helper()
    if len(expected) != len(actual) {
        t.Errorf("expected (%+v) is not equal to actual (%+v): len(expected)=%d len(actual)=%d",
            expected, actual, len(expected), len(actual))
    }
    for i := range expected {
        if expected[i] != actual[i] {
            t.Errorf("expected[%d] (%+v) is not equal to actual[%d] (%+v)",
                i, expected[i],
                i, actual[i])
        }
    }
}

字符串
有些人使用testify,但我更喜欢上面的复制+粘贴功能。

相关问题