初始化循环 Golang
Initialization loop Golang
您好,我正在尝试使我的功能单元可测试。其中一个建议是将函数分配给一个变量并使其全局可访问。我刚刚这样做了,但现在我正在经历一个初始化循环,下面是我的代码
////////////////////////
// main.go
////////////////////////
func DownloadFile(filename string) {
// Initialized request variable here
// ... doing initialization
// End of initialization
res = ProcessDownload(request)
if res == 401 {
return doRetry(filename)
}
// some code here
return downloadFile(filename)
}
func DoRetry(filename string) {
// Doing some database insert/updating
return downloadFile(string)
}
在我的另一个文件中,我将此函数分配给变量
//////////////////////
// global.go
//////////////////////
var downloadFile = DownloadFile
var doRetry = DoRetry
我在 global.go 中这样做的原因是使 DoRetry 和 DownloadFile 单元可测试。这意味着我可以 MOCK 函数而无需创建接口。因为这只是一个独立的功能,不需要在某个 class 内。变量的所有其余部分都可以,但是当涉及到执行递归行为的函数时,我得到以下错误
./global.go:22:5: initialization loop:
/go/src/project/global.go:22:5 downloadFile refers to
/go/src/project/process.go:403:99 DownloadFile refers to
/go/src/project/global.go:23:5 doRetry refers to
/go/src/project/process.go:394:89 DoRetry refers to
/go/src/project/global.go:22:5 downloadFile
FAIL project [build failed]
我知道这在 中可能是重复的,但我看不出这里的解决方案如何解决我的问题。
请帮我解决这个问题。谢谢
我在这个 link
中读到了关于模拟函数的内容
Mock functions in Go
https://husobee.github.io/golang/testing/unit-test/2015/06/08/golang-unit-testing.html
解决方案是在声明 downloadFile
和 doRetry
函数变量时不赋值,而是 "defer" 初始化包 init()
函数,就像这样:
var downloadFile func(string) //= DownloadFile
var doRetry func(string) //= DoRetry
func init() {
downloadFile = DownloadFile
doRetry = DoRetry
}
这样,变量首先会用 nil
(函数类型的零值)初始化,这意味着它们不依赖于 DownloadFile()
和 DoRetry()
函数,并且 稍后包init()
函数运行时,会将函数值赋给变量,因此不会发生初始化循环。
您好,我正在尝试使我的功能单元可测试。其中一个建议是将函数分配给一个变量并使其全局可访问。我刚刚这样做了,但现在我正在经历一个初始化循环,下面是我的代码
////////////////////////
// main.go
////////////////////////
func DownloadFile(filename string) {
// Initialized request variable here
// ... doing initialization
// End of initialization
res = ProcessDownload(request)
if res == 401 {
return doRetry(filename)
}
// some code here
return downloadFile(filename)
}
func DoRetry(filename string) {
// Doing some database insert/updating
return downloadFile(string)
}
在我的另一个文件中,我将此函数分配给变量
//////////////////////
// global.go
//////////////////////
var downloadFile = DownloadFile
var doRetry = DoRetry
我在 global.go 中这样做的原因是使 DoRetry 和 DownloadFile 单元可测试。这意味着我可以 MOCK 函数而无需创建接口。因为这只是一个独立的功能,不需要在某个 class 内。变量的所有其余部分都可以,但是当涉及到执行递归行为的函数时,我得到以下错误
./global.go:22:5: initialization loop:
/go/src/project/global.go:22:5 downloadFile refers to
/go/src/project/process.go:403:99 DownloadFile refers to
/go/src/project/global.go:23:5 doRetry refers to
/go/src/project/process.go:394:89 DoRetry refers to
/go/src/project/global.go:22:5 downloadFile
FAIL project [build failed]
我知道这在
请帮我解决这个问题。谢谢 我在这个 link
中读到了关于模拟函数的内容Mock functions in Go
https://husobee.github.io/golang/testing/unit-test/2015/06/08/golang-unit-testing.html
解决方案是在声明 downloadFile
和 doRetry
函数变量时不赋值,而是 "defer" 初始化包 init()
函数,就像这样:
var downloadFile func(string) //= DownloadFile
var doRetry func(string) //= DoRetry
func init() {
downloadFile = DownloadFile
doRetry = DoRetry
}
这样,变量首先会用 nil
(函数类型的零值)初始化,这意味着它们不依赖于 DownloadFile()
和 DoRetry()
函数,并且 稍后包init()
函数运行时,会将函数值赋给变量,因此不会发生初始化循环。