登录
首页 >  Golang >  Go问答

使用Golang初始化循环

来源:stackoverflow

时间:2024-03-09 12:57:31 102浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《使用Golang初始化循环》,也希望能帮助到大家,如果阅读完后真的对你学习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 中这样做的原因是为了使 doretrydownloadfile 单元可测试。这意味着使用这种方法我可以模拟该函数而无需创建接口。因为这只是一个独立的函数,不需要位于某个类中。变量的所有其余部分都可以,但是当涉及执行递归行为的函数时,我收到以下错误

./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]

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

请帮我解决这个问题。谢谢 我在这个链接中读到了有关模拟函数的内容

go 中的模拟函数

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


解决方案


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

var downloadFile func(string) //= DownloadFile
var doRetry func(string)      //= DoRetry

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

这样,变量首先将使用 nil (函数类型的零值)进行初始化,这意味着它们不依赖于 downloadfile()doretry() 函数,并且稍后init() 函数运行,会将函数值分配给变量,因此不会发生初始化循环。

到这里,我们也就讲完了《使用Golang初始化循环》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>