Go 是否优化了无法访问的 if 语句?

Does Go optimize out unreachable if-statements?

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

查看带注释的程序集。