用gofmt生成,替换变量值

时间:2014-12-17 08:56:21

标签: go gofmt

'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声明?

2 个答案:

答案 0 :(得分:3)

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

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

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

More info in the linker docs


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函数来定义该变量你需要。该变量值仅在测试期间使用。


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