4

“生成”工具的发布开辟了许多令人兴奋的可能性。我一直在努力让我的测试变得更好。我有一个查询外部 API 的函数,该 API 的位置在全局变量中定义。一个难题是用在“生成时间”确定的值替换该值。

我有:

//go:generate gofmt -w -r "var apiUrl = a -> var apiUrl = \"http://example.com\"" $GOFILE

运行 go generate 然后出错:

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陈述?

4

2 回答 2

3

您可以为此使用链接器标志-X。例如,

go build -ldflags "-X main.APIURL 'http://example.com'"

将构建您的程序并将APIURL变量设置为http://example.com.

链接器文档中的更多信息


Go 1.5 编辑:从 Go 1.5 开始,建议使用新格式:

go build -ldflags "-X main.APIURL=http://example.com"

(注意等号。)

于 2014-12-17T18:14:32.950 回答
1

在您的测试文件中说api_test.go添加一个生成命令,该命令生成另一个名为的文件api_endpoint_test.go,该文件位于同一包中,并且仅定义或初始化(使用init函数)您需要的变量。该变量值仅在测试期间使用。


作为记录,我不太明白你为什么要这样做,而不是在运行时初始化变量或使用一些传统的配置方法。

于 2014-12-17T13:32:30.770 回答