Avatar ·

可以在Go中使用assert吗?还是像C++中说的那样是邪恶的?

大家好!我是Go新手,从C++转过来的。在C++中,我经常使用assert()来检查前置条件和不变量——例如,指针不为nil,索引在数组范围内,或者对象状态正确。这在调试时非常有帮助。 开始写Go后,我注意到标准库中没有assert函数。当然,有testing包,但它只用于测试。在生产代码中,我开始写自己的检查,比如: ```go if somePtr == nil { panic("somePtr is nil, 这是bug!") } ``` 但同事说这是一种糟糕的风格,在Go中通常返回错误而不是panic。他举了C++的例子,其中assert经常被批评,因为它可能被NDEBUG宏禁用,从而导致隐藏的bug。 现在我困惑了。一方面,C++中的assert是记录和检查假设的便捷方式。另一方面,Go的错误处理文化完全不同。问题是:在Go中是否应该使用类似assert的结构?如果应该,