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

进行编译如果您在linuxMac上工作,您可以尝试使用“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”

缺点:

  • 您不能编写名为“define”或“ifndef”等的go函数,这些函数将由m4转换为宏
  • 如果你有很多文件,你可能想改进你的Makefile
  • 你可能想学习m4,这有点困难和复杂

  • 严格来说,没有。没有预处理器,因此没有预处理器魔术。就像在Java中,GoLang中没有任何嵌入式预处理器,但也像Java一样,可以使用第三方类似的工具。例如,我使用它并取得了很好的效果这是我一直想做的事情,但使其不切实际的主要缺点是Linter不理解m4,并且会非常困惑。显然,在没有任何过梁的情况下编写代码来提供实时反馈是可能的,但如果不明显的话,这是相当令人不快的。您可以将这些文件中的常量声明为true或false,因为它们是互斥的。然后可以在if语句中使用该常量。Go将根据构建标记识别if语句始终为true或false,并从非调试构建中删除代码,反之亦然。