推迟到函数外部

Defer to outside a function

我常用的模式是:

resource.open()
defer resource.close()

有时会检查中间的错误,这会导致:

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

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

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

It would be wonderful to wrap all this in a function.

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

However doing so would close the resource as soon as the function call is over.

完全正确。

Is there any way around this [...]?

没有

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

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