我完成了一个使用C++编写的项目,其中我使用#define
宏来为项目命名,在多个地方使用该名称。我不经常更改此名称,但有时可能需要更改此名称,然后我更改此宏并重新构建我的代码。现在我正在将此代码转换为Go。有人可以建议我如何在Go中实现此功能吗?我不想使用全局变量来实现此目的,因为我有很多这样的宏,我怀疑这会导致我的项目占用更多的CPU并影响性能。
幸运的是,Go语言不支持宏。
在Go语言中,有两种方法可以实现其他编程语言中使用宏的功能:
看起来,你需要的是后者。
不幸的是,这个特性的帮助文档几乎无法发现,但它在输出中有所解释。
$ go tool link -help
摘自文档的相关部分:
-X definition
添加字符串值
definition
,格式为importpath.name=value
那么您可以按照以下步骤进行操作:
在任意包中定义一个字符串常量,您希望在构建时更改其值。
例如,在包foo
中,您定义了常量Bar
。
在编译时的链接阶段,您向go build
或go install
命令传递一个特殊标志:
$ go install -ldflags='-X foo.Bar="my super cool string"'
作为结果,生成的二进制文件将在其“只读数据”段中将常量foo.Bar
设置为值“my super cool string”,并且该值将被程序代码使用。有关-ldflags
选项的更多信息,请参见go help build
输出。#ifdef
-fery;而在某些编程语言,比如LISP中,“真正”的宏是一个更有趣/复杂的话题。每个跟C打过交道的人,肯定都不止一次地要运行编译器的特殊模式“将所有宏展开后所得到的内容进行输出”,以尝试理解到底发生了什么鬼东西。 - kostixGo语言不支持宏
。
但是你可以在一个包内定义常量,并在需要引用的地方使用。
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