const if语句与Go中的#ifdef宏做同样的事情吗?

Joe*_*Joe 4 go

Go中没有文本预处理.像Java和其他类似的人一样,如果我想删除一段代码,我可以使用一个const值并用一个代码包围代码if.

如果我这样做,编译器是否会优化AST中的代码并生成代码?或者每次执行条件?

编辑:如果我想复制#ifdef什么是最好的方法呢?

Eva*_*haw 9

如果具有恒定条件的语句与#ifdef因为内部代码无论如何总是被编译都不相同.但是,编译器会在可能的情况下对其进行优化.考虑这个程序:

package main

import (
    "fmt"
)

func main() {
    if false {
        fmt.Println("Hello, world!")
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们运行go tool 6g -S test.go,这是main函数的汇编输出:

--- prog list "main" ---
0000 (test.go:7) TEXT    main+0(SB),$40-0
0001 (test.go:11) RET     ,
Run Code Online (Sandbox Code Playgroud)

死代码消失了所以它只是返回.

如果确实需要实际有条件地编译部分代码,最好通过构建系统来完成.

  • 您可以通过-tags标志将标签传递给`go build`.然后你可以通过在文件中放置诸如`// + build tag`或`// + build!tag`之类的东西来有条件地构建文件.请参阅此文档:http://golang.org/pkg/go/build/ (6认同)