不幸的是,Go 缺乏内置断言。我想以这种方式实现它们:
const ASSERT = true
func SomeFunction() {
if ASSERT && !some_condition_that_should_always_be_true() {
panic("Error message or object.")
}
}
我的问题是,如果我定义 const ASSERT = false
,是否会优化 if 语句?
最佳答案
正如人们在对您问题的评论中指出的那样,它是特定于实现的。
gc 确实删除了它。您可以使用 -gcflags '-S'
构建您的程序,并看到 ASSERT
部分不在二进制文件中。
例如用-gcflags '-S'
编译下面的代码,你会看到第8行和第9行的代码被包含进来,但是把Assert
改成false,并且它们不会出现在 asm 列表中。
package main
const Assert = true
var cond = true
func main() {
if Assert && !cond {
panic("failed")
}
}
编辑:
至于 gccgo,它删除了 -O1
及以上的代码。您可以通过使用
go build -compiler gccgo -gccgoflags '-O1' main.go
然后做
objdump -S main
查看带注释的程序集。
关于if-statement - Go 是否优化了无法访问的 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29654175/