首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化回路Golang

初始化回路Golang
EN

Stack Overflow用户
提问于 2018-08-03 07:29:17
回答 1查看 2.7K关注 0票数 2

嗨,我在试着让我的功能单元可以测试。其中一项建议是将该函数赋值为一个变量,并使其可在全球范围内访问。我刚这么做,但现在我正在经历一个初始化循环,下面是我的代码

代码语言:javascript
复制
////////////////////////
// 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)
}

在我的另一个文件中,我将这个函数赋值给变量。

代码语言:javascript
复制
//////////////////////
// global.go
//////////////////////

var downloadFile = DownloadFile
var doRetry = DoRetry

我在global.go中这样做的原因是为了使DoRetryDownloadFile单元可测试。也就是说,使用此方法,我可以模拟函数,而无需创建接口。因为这只是一个独立的函数,所以不需要在某个类中。变量的其余部分都是可以的,但是当涉及到执行递归行为的函数时,我会得到以下错误

代码语言:javascript
复制
./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]

我知道这可能是here中的重复,但我看不出这里的解决方案是如何解决我的问题的。

请帮帮我。谢谢我在这个链接中读到了关于模拟一个函数的文章。

Mock functions in Go

https://husobee.github.io/golang/testing/unit-test/2015/06/08/golang-unit-testing.html

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-03 07:49:10

解决方案是在声明downloadFiledoRetry函数变量时不赋值,而是将初始化“推迟”到包init()函数,如下所示:

代码语言:javascript
复制
var downloadFile func(string) //= DownloadFile
var doRetry func(string)      //= DoRetry

func init() {
    downloadFile = DownloadFile
    doRetry = DoRetry
}

这样,变量首先将使用nil (函数类型的零值)初始化,这意味着它们不依赖于DownloadFile()DoRetry()函数,稍后当包init()函数运行时,将为变量分配函数值,因此不会发生初始化循环。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51667411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档