为了账号安全,请及时绑定邮箱和手机立即绑定

推迟到函数之外

推迟到函数之外

Go
慕的地6264312 2022-07-04 10:01:40
我使用的一个常见模式是:resource.open()defer resource.close()有时会检查两者之间的错误,这会导致:err := resource.open()if err != nil{     //do error stuff and return}defer resource.close()有时我会连续需要多个打开/关闭资源,导致前 5 行的变化一个接一个地重复。这种变化可能会在我的代码中逐字重复多次(我需要所有相同的资源)。将所有这些包装在一个函数中会很棒。但是,这样做会在函数调用结束后立即关闭资源。有没有办法解决这个问题 - 要么推迟到调用堆栈的“升级”或其他方式?
查看完整描述

2 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

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


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()

   ...

}


查看完整回答
反对 回复 2022-07-04
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

将所有这些包装在一个函数中会很棒。

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

但是,这样做会在函数调用结束后立即关闭资源。

确切地。

有没有办法解决 [...]?

不。


查看完整回答
反对 回复 2022-07-04
  • 2 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信