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

标签 if-statement error-handling go assert

不幸的是,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/

相关文章:

go - 错误 : failed to initialize database, 拨号 tcp 时遇到错误:0:connectex:请求的地址在其上下文中无效

git - 如何检查 if/else 中是否存在标签

java - 为什么我的代码会进入条件应为假的 else-if 语句?

c# - 在C#中的重写方法中捕获异常

java - 在android中验证函数先决条件

go - 如何在golang中将*multipart.FileHeader文件类型转换为*os.File

google-app-engine - 您能解释一下应用程序引擎上下文接口(interface)是什么吗?

python,随机播放直到列表完全不同

php - if, else if echo 语句

php - Symfony2-显示错误的凭证错误