go - 推迟到函数外
问题描述
我使用的一个常见模式是:
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()
...
}
推荐阅读
- android - Toast 在 Android API 28 中显示不到一秒钟
- android - 如何将 GitHub 存储库下载到我当前正在处理的 Andriod Studio 项目中?
- python - 使用 pandas 查找具有给定范围的列的长度
- sql - SQL 帮助 - 在当前记录时间戳之前查找顺序
- image - 如何在 react-native 中成功缓存最常用的数据(图像和文本)
- r - 在闪亮的 R 中显示来自网络的图像
- python - OSError: [Errno 1] 不允许操作
- go - Go中使用递归和并发的第N个斐波那契数
- python - 在使用 keras Lambda 时,如何处理“TypeError: Object arrays are not supported”?
- python - Python 给了我索引号而不是列表中的输入。