golang 中的 C 风格条件编译

C-style conditional compilation in golang

golang是否支持

#define DEBUG 

#ifdef DEBUG 
  fmt.Println("Debug message..."); 
#endif 

所以我可以构建一个运行时开销为零的调试版本?

Go 没有预处理器或宏系统。您可以做的是传入标签以通过 -tags 标志进行构建并使用构建约束。为此,您需要同一来源的两个版本,并且只有一个版本会根据标签是否存在而构建。

查看 https://golang.org/pkg/go/build/

中的构建约束

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" command.This 命令是一个 处理器,正好适合这个问题。

在"go build"之前为运行m4命令写一个Makefile可以和使用"go build -tags ..."做同样的事情并且支持更多的自定义,当然,保存你的工作。

例如:

将这些写在你的 go 文件中(例如 main.go):

define(DEBUG)
ifdef(`DEBUG',
    fmt.Println("Debug message..."); 
)

将这些写入您的 Makefile 文件中:

all:*.go
    mv main.go main.go.bak
    m4 main.go.bak > main.go
    go build
    mv main.go.bak main.go

然后 运行 "make".

缺点:

  1. 你不能写一个名为 "define" 或 "ifndef" 等的函数,它会被 m4 翻译成 Macro。
  2. 如果您有很多文件,您可能需要改进 Makefile。
  3. 你可能想学m4,有点难,有点复杂