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

Mat*_*att 5 error-handling assert if-statement go

Go非常不幸缺乏内置断言.我想以这种方式实现它们:

const ASSERT = true

func SomeFunction() {
        if ASSERT && !some_condition_that_should_always_be_true() {
                panic("Error message or object.")
        }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我定义if语句会被优化const ASSERT = false吗?

Ain*_*r-G 7

正如人们在对您的问题的评论中所指出的那样,它是针对具体实施的.

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

至于gccgo,它会删除此代码-O1.您可以通过编译相同的代码来查看它

go build -compiler gccgo -gccgoflags '-O1' main.go
Run Code Online (Sandbox Code Playgroud)

然后做

objdump -S main
Run Code Online (Sandbox Code Playgroud)

查看带注释的程序集.