我在C ++中完成的项目,我使用#define
宏来提供项目的名称,我在几个地方使用过,我不经常更改此名称但有时我可能会需要改变这个,然后我改变这个宏并重建我的代码。现在我将此代码转换为Go。有人可以建议我如何在Go中实现这个?我没有兴趣为此目的使用全局变量,因为我有很多这样的宏,我怀疑这会导致我的项目占用更多的CPU并影响性能。
答案 0 :(得分:13)
幸运的是,Go不支持宏。
Go中有两个场所用于实现使用宏完成的操作 在其他编程语言中:
看起来,后者就是你所追求的。
不幸的是,这个功能的帮助几乎是不可发现的 本身,但它在
的输出中解释$ go tool link -help
引用相关位:
-X definition
添加
形式的字符串值definition
importpath.name=value
所以你像这样滚动:
在任何方便的包装中, 你定义一个字符串常量,你想要改变它的值 在运行时。
假设您在包Bar
中定义常量foo
。
在构建时,您将转到go build
或go install
调用
链接阶段的特殊标志:
$ go install -ldflags='-X foo.Bar="my super cool string"'
结果,生成的二进制文件将具有常量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