我可以传递构建命令标志并读取内部代码吗?

Pao*_*aJ. 1 go

我想在init函数中执行这两行中的一行

func init() {
    log.SetPrefix(">>>>>>>>>>>>>   ")


    log.SetOutput(ioutil.Discard)
}
Run Code Online (Sandbox Code Playgroud)

如何在make文件中实现与C和宏定义类似的东西?我像go build my_project一样构建go程序,我没有任何自定义make文件.我可以传递构建命令标志并读取内部代码吗?

Rob*_*ier 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")
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,如果你用它来构建它go build,那MODE将是"".但你也可以用这种方式构建它:

go build -ldflags "-X main.MODE PROD"
Run Code Online (Sandbox Code Playgroud)

现在MODE将是"PROD".您可以使用它来根据构建设置修改逻辑.我通常使用这种技术在二进制文件中设置版本号; 但它可以用于各种构建时配置.请注意,它只能设置字符串.所以你不能做MODE一个bool或整数.


您也可以使用标签来实现这一点,标签设置稍微复杂一些,但功能更强大.创建三个文件:

main.go

package main

func main() {
    doThing()
}
Run Code Online (Sandbox Code Playgroud)

main_prod.go

// +build prod

package main

func doThing() {
    println("I'm in prod mode")
}
Run Code Online (Sandbox Code Playgroud)

main_devel.go

// +build !prod

package main

func doThing() {
    println("I'm NOT in prod mode")
}
Run Code Online (Sandbox Code Playgroud)

现在,当你构建时go build,你将获得你的main_devel.go版本(文件名无关紧要;只是// +build !prod顶部的行).但是你可以通过构建来获得生产构建go build -tags prod.

请参阅构建文档中的"构建约束"一节.