使用gofmt生成,替换变量值
该工具的发布带来了许多令人兴奋的可能性。 我一直在努力使我的考试更好。我有一个查询外部API的函数,该API的位置在全局变量中定义。其中一个难题是用“生成时间”确定的值替换该值 我有:使用gofmt生成,替换变量值,go,gofmt,Go,Gofmt,该工具的发布带来了许多令人兴奋的可能性。 我一直在努力使我的考试更好。我有一个查询外部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:
//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
语句是什么?在您的测试文件中说api\u test.go
添加一个generate命令,该命令生成另一个名为api\u endpoint\u test.go的文件,该文件位于同一个包中,并且只定义或初始化(使用init
函数)您需要的变量。该变量值仅在测试期间使用
作为记录,我不太明白为什么要这样做,而不是在运行时初始化变量或使用一些常规配置方法。您可以使用链接器标志-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"
(请注意等号。)经过广泛的搜索,我相当确定仅使用gofmt是不可能的。好消息是go generate可以在你的$PATH中运行任意脚本,这样你就可以让go generate运行sed或者其他任何东西了。我担心你会得出这样的结论。然后返回到sed
。谢谢。是的,我认为唯一真正的方法是使用os.Expand或其他工具编写自己的生成脚本和模板,如果你能用sed完成同样的事情,你也可以用sed。