登录
首页 >  Golang >  Go问答

将函数外延至推迟

来源:stackoverflow

时间:2024-02-25 10:39:28 448浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《将函数外延至推迟》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我使用的常见模式是:

resource.open()
defer resource.close()

有时会检查两者之间的错误,这会导致:

err := resource.open()
if err != nil{
     //do error stuff and return
}
defer resource.close()

有时我需要连续打开/关闭多个资源,导致前 5 行的变化不断重复。这种变化可能会在我的代码中逐字重复多次(我需要所有相同的资源)。

如果能将所有这些都封装在一个函数中那就太好了。但是,这样做会在函数调用结束后立即关闭资源。有什么办法可以解决这个问题 - 要么推迟“升级”调用堆栈,要么采用其他方式?


解决方案


实现此目的的一种方法是使用带有回调的“初始化程序”函数:

func withresources(f func(resource1, resource2)) {
   r1:=newresource1()
   defer r1.close()
   r2:=newresource2()
   defer r2.close()
   f(r1,r2)
}

func f() {
  withresources(func(r1 resource1, r2 resource2) {
    // use r1, r2
  })
}

函数 f 的签名取决于您的具体用例。

另一种方法是使用资源集的结构:

type Resources struct {
   R1 Resource1
   R2 Resource2
   ...
}

func NewResources() *Resources {
   r:=&Resources{}
   r.R1=NewR1()
   r.R2=NewR2()
   return r
}

func (r *Resources) Close() {
   r.R1.Close()
   r.R2.Close()
}

func f() {
   r:=NewResources()
   defer r.Close()
   ...
}

很可能很多人会讨厌阅读这样的代码。所以“精彩”可能是非常主观的。

完全正确。

没有。

今天关于《将函数外延至推迟》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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