我用C++完成项目,我用#define宏来给出项目的名称,我在几个地方使用过,我不经常更改这个名称,但有时我可能需要更改它,然后我更改此宏并重建我的代码.现在我将此代码转换为Go.有人可以建议我如何在Go中实现这个?我对使用全局变量没有兴趣,因为我有很多这样的宏,我怀疑这会导致我的项目占用更多的CPU并影响性能.
kos*_*tix 14
幸运的是,Go不支持宏.
Go中有两个场所用于实现在其他编程语言中使用宏所做的事情:
看来,后者就是你所追求的.
不幸的是,这个功能的帮助本身几乎是不可发现的,但它在输出中解释了
$ go tool link -help
Run Code Online (Sandbox Code Playgroud)
引用它的相关位:
-X definition添加
definition表单的字符串值importpath.name=value
所以你像这样滚动:
在任何方便的包中,您可以定义一个字符串常量,您希望在运行时更改该值.
比方说,你Bar在包中定义常量foo.
在构建时,您将传递go build或go install调用链接阶段的特殊标志:
$ go install -ldflags='-X foo.Bar="my super cool string"'
Run Code Online (Sandbox Code Playgroud)结果,生成的二进制文件将foo.Bar
在其"只读数据"段中将常量设置为值"my super cool string",该值将由程序的代码使用.
另请参阅go help build有关该-ldflags选项的输出.
Go不支持Macros.
但是您可以在包中使用常量并在需要的地方引用它.
package constant
// constants.go file
const (
ProjectName = "My Project"
Title = "Awesome Title"
)
Run Code Online (Sandbox Code Playgroud)
在你的程序中
package main
import "<path to project>/constant" // replace the path to project with your path from GOPATH
func main() {
fmt.Println(constant.ProjectName)
}
Run Code Online (Sandbox Code Playgroud)
项目结构将是
project
|- constant
| |- constants.go
|-main.go
Run Code Online (Sandbox Code Playgroud)