推迟到函数之外

我使用的一个常见模式是:


resource.open()

defer resource.close()

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


err := resource.open()

if err != nil{

     //do error stuff and return

}

defer resource.close()

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


将所有这些包装在一个函数中会很棒。但是,这样做会在函数调用结束后立即关闭资源。有没有办法解决这个问题 - 要么推迟到调用堆栈的“升级”或其他方式?


慕的地6264312
浏览 83回答 2
2回答

Helenr

一种方法是使用带有回调的“初始化程序”函数: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()   ...}

饮歌长啸

将所有这些包装在一个函数中会很棒。很可能很多人会讨厌阅读这样的代码。所以“精彩”可能是非常主观的。但是,这样做会在函数调用结束后立即关闭资源。确切地。有没有办法解决 [...]?不。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go