golang中的C风格条件编译
葛朗支持吗golang中的C风格条件编译,go,conditional-compilation,Go,Conditional Compilation,葛朗支持吗 #define DEBUG #ifdef DEBUG fmt.Println("Debug message..."); #endif 所以我可以用零运行时开销构建调试版本?Go没有预处理器或宏系统。您可以做的是通过-tags标志传入标记进行构建,并使用构建约束。要做到这一点,您需要两个版本的同一个源代码,只有一个版本会得到构建,这取决于标记是否存在 查看中的构建约束 main_debug.go // +build debug package main import
#define DEBUG
#ifdef DEBUG
fmt.Println("Debug message...");
#endif
所以我可以用零运行时开销构建调试版本?Go没有预处理器或宏系统。您可以做的是通过
-tags
标志传入标记进行构建,并使用构建约束。要做到这一点,您需要两个版本的同一个源代码,只有一个版本会得到构建,这取决于标记是否存在
查看中的构建约束
main_debug.go
// +build debug
package main
import (
"fmt"
)
func main() {
fmt.Println("Debug build")
}
main_release.go
// +build !debug
package main
import (
"fmt"
)
func main() {
fmt.Println("Release build")
}
在这里,
go build
将使用main_release.go进行编译,go build-tags debug
将使用main_debug.go进行编译如果您在linux或Mac上工作,您可以尝试使用“m4”命令。此命令是一个宏处理器,正好适合此问题
// +build debug
package main
import (
"fmt"
)
func main() {
fmt.Println("Debug build")
}
在“go build”之前编写一个Makefile来运行m4命令,可以与使用“go build-tags…”做的相同,并且支持更多的定制,当然,还可以保存您的工作
例如:
在go文件(如main.go)中写入以下内容:
在Makefile文件中写入以下内容:
all:*.go
mv main.go main.go.bak
m4 main.go.bak > main.go
go build
mv main.go.bak main.go
然后运行“make”
缺点:
严格来说,没有。没有预处理器,因此没有预处理器魔术。就像在Java中,GoLang中没有任何嵌入式预处理器,但也像Java一样,可以使用第三方类似的工具。例如,我使用它并取得了很好的效果这是我一直想做的事情,但使其不切实际的主要缺点是Linter不理解m4,并且会非常困惑。显然,在没有任何过梁的情况下编写代码来提供实时反馈是可能的,但如果不明显的话,这是相当令人不快的。您可以将这些文件中的常量声明为true或false,因为它们是互斥的。然后可以在if语句中使用该常量。Go将根据构建标记识别if语句始终为true或false,并从非调试构建中删除代码,反之亦然。