我希望在init函数中执行这两行中的一行
func init() {
log.SetPrefix(">>>>>>>>>>>>> ")
log.SetOutput(ioutil.Discard)
}
如何在make文件中实现与C和宏定义类似的内容? 我像go build my_project一样构建go程序,我没有任何自定义make文件。我可以传递构建命令标志并读取内部代码吗?
答案 0 :(得分:6)
创建一个可以测试的字符串变量。然后使用传递给链接器的-X
设置该字符串变量。例如:
package main
var MODE string
func main() {
if MODE == "PROD" {
println("I'm in prod mode")
} else {
println("I'm NOT in prod mode")
}
}
现在,如果仅使用go build
构建此代码,MODE
将为""
。但你也可以用这种方式构建它:
go build -ldflags "-X main.MODE PROD"
现在MODE
将是"PROD"
。您可以使用它来根据构建设置修改逻辑。我通常使用这种技术在二进制文件中设置版本号;但它可以用于各种构建时配置。请注意,它只能设置字符串。所以你不能使MODE
成为一个bool或整数。
您也可以使用标签来实现这一点,标签设置稍微复杂一些,但功能更强大。创建三个文件:
package main
func main() {
doThing()
}
// +build prod
package main
func doThing() {
println("I'm in prod mode")
}
// +build !prod
package main
func doThing() {
println("I'm NOT in prod mode")
}
现在,当您使用go build
进行构建时,您将获得main_devel.go
版本(文件名无关紧要;只有顶部的// +build !prod
行)。但是,您可以通过使用go build -tags prod
构建生产版本。
请参阅build文档中的构建约束部分。