如何在Go中实现宏?

时间:2018-03-28 06:30:35

标签: go macros

我在C ++中完成的项目,我使用#define宏来提供项目的名称,我在几个地方使用过,我不经常更改此名称但有时我可能会需要改变这个,然后我改变这个宏并重建我的代码。现在我将此代码转换为Go。有人可以建议我如何在Go中实现这个?我没有兴趣为此目的使用全局变量,因为我有很多这样的宏,我怀疑这会导致我的项目占用更多的CPU并影响性能。

2 个答案:

答案 0 :(得分:13)

幸运的是,Go不支持宏。

Go中有两个场所用于实现使用宏完成的操作 在其他编程语言中:

  • “元编程”使用code generation完成。
  • “魔术变量/常量”使用“符号替换”实现 在链接时。

看起来,后者就是你所追求的。

不幸的是,这个功能的帮助几乎是不可发现的 本身,但它在

的输出中解释
$ go tool link -help

引用相关位:

  

-X definition

     

添加definition

形式的字符串值importpath.name=value

所以你像这样滚动:

  1. 在任何方便的包装中, 你定义一个字符串常量,你想要改变它的值 在运行时。

    假设您在包Bar中定义常量foo

  2. 在构建时,您将转到go buildgo install调用 链接阶段的特殊标志:

    $ go install -ldflags='-X foo.Bar="my super cool string"'
    
  3. 结果,生成的二进制文件将具有常量foo.Bar 在“只读数据”段中设置为“my super cool string”, 该值将由程序代码使用。

    另请参阅go help build选项的-ldflags输出。

答案 1 :(得分:7)

Go不支持Macros 但是你可以在包中使用常量并在需要的地方引用它。

package constant
// constants.go file

const (
    ProjectName = "My Project"
    Title       = "Awesome Title"
)

并在你的程序中

package main
import "<path to project>/constant" // replace the path to project with your path from GOPATH

func main() {
     fmt.Println(constant.ProjectName)
}

项目结构将是

project
   |- constant
   |      |- constants.go
   |-main.go