'generate'工具的发布开辟了许多令人兴奋的可能性。 我一直试图让我的测试变得更好。我有一个查询外部API的函数,该API的位置在全局变量中定义。其中一个难题是用“生成时间”确定的值替换该值。
我有:
//go:generate gofmt -w -r "var apiUrl = a -> var apiUrl = \"http://example.com\"" $GOFILE
运行去生成错误输出:
parsing pattern var apiUrl = a at 1:1: expected operand, found 'var'
不能像这样使用占位符:
gofmt -r 'API_GOES_HERE -> "http://example.com"' -w
那是因为,当我编译生产代码时,源被重写,因此后续的测试编译不再能替换占位符(它已被替换)。
我意识到我在某种程度上滥用gofmt
,但我不想回到sed
。
什么是有效的go:generate
声明?
答案 0 :(得分:3)
您可以使用链接器标志-X
。例如,
go build -ldflags "-X main.APIURL 'http://example.com'"
将APIURL
变量设置为http://example.com
来构建您的程序。
Go 1.5 edit:从Go 1.5开始,它的recommended使用新格式:
go build -ldflags "-X main.APIURL=http://example.com"
(注意等号。)
答案 1 :(得分:1)
在您的测试文件中说api_test.go
添加一个生成命令,该命令生成另一个名为api_endpoint_test.go
的文件,该文件位于同一个包中,并且仅定义或使用init
函数来定义该变量你需要。该变量值仅在测试期间使用。
为了记录,我不太明白你为什么要这样做,而不是在运行时或使用一些传统的配置方法初始化变量。