草庐IT

go - 在 Golang 中推迟延期

coder 2024-07-08 原文

我是 Go 的新手,我必须编写一个必须在不同点打开大量文件的应用程序。打开每个文件的代码是

fl, err := os.Open(..)
check(err)
defer fl.Close()

如果出现任何问题,check 只会调用 panic

现在,正如我所说,该片段会重复多次。我想要这样的东西:

func foo(f string){
    fl, err := os.Open(f)
    check(err)
    defer fl.Close() //lolwut
}

当然,一旦 foo 返回,defer 就会启动并关闭文件。

有没有办法延迟一个函数的延迟,直到它的调用者决定它的时间?

到目前为止我尝试做的是,将 defer 放在一个匿名函数中,让 foo 返回它并让调用者执行 that(最好在一行)。然而,我在实现时遇到了一些障碍,我什至不确定这是否是正确的方法。

tl;dr:有没有办法在 Go 中推迟对调用函数的延迟?

最佳答案

我认为你的设计有误。您最初想要做的事情并没有真正意义:如果您想将 Close() 推迟到调用者中,您就剥夺了决定调用者释放分配的所有灵 active 。如果调用者必须保留文件的时间超过其自身的持续时间怎么办?

您可能希望将 foo() 视为资源分配函数,就像 io.Open() 一样。因此,如果一个函数调用 foo(),它就刚刚分配了一个资源。 foo() 不负责释放此资源,调用者负责,就像 io.Open() 一样。

关于go - 在 Golang 中推迟延期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106093/

有关go - 在 Golang 中推迟延期的更多相关文章

  1. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  2. ruby-on-rails - 用于 Ruby 的 vim 中的全局 "Go to definition"? - 2

    自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby​​编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例

  3. ruby-on-rails - Rails 上的 ruby : How to have multiple submit buttons going to different methods (maybe with with_action? ) - 2

    这个问题在这里已经有了答案:HowdoIcreatemultiplesubmitbuttonsforthesameforminRails?(7个答案)关闭9年前。所以..'save'%>'library'%>然后在我的Controller中:with_actiondo|a|a.savedoenda.librarydoendend问题是只有一个操作被调用...两个submit_tags调用相同的操作...知道为什么吗?或者我如何获得两个按钮以将表单提交给两种不同的方法?

  4. DiFi: A Go-as-You-Pay Wi-Fi Access System 精读笔记(三) - 2

    IV.SYSTEMIMPLEMENTATIONWeadoptmodulardesignfollowingtheintegrationofblockchain.Itbringsmoreflexibilitybyseparatingtheimplementationofdifferentfunctionalities,sowecouldleveragetheadvantagesoftheblockchain-basedsmartcontractwhilereducingoverhead.Figure3illustrateshowdifferentmodulesareinvolvedintheint

  5. go-templates - 如何根据表达式有条件地在 Go 模板中设置变量,如果不使用 if 语句包装可能会导致错误 - 2

    问题我该如何做这样的事情:{{$use_ssl:=(ne$.Env.CERT_NAME"")}}其中$.Env.CERT_NAME可能为零/未定义。如果它是零,它给出这个错误:at:errorcallingne:invalidtypeforcomparison注意:我无法控制传递给Go模板的对象,因此必须完全在模板本身内解决这个问题。我尝试过的我试图通过首先检查它是否为非空来变通:{{$use_ssl:=(($.Env.CERT_NAME)&&(ne$.Env.CERT_NAME""))}}但它给出了这个错误:unexpected"&"inoperand所以我切换到这个,这在语法上是允

  6. Go time与string的相爱相杀 - 2

    time包与string包可以说是在Go语言的开发中常用的两个包实际开发过程中(例如web开发)经常会遇到time类型与string类型的交互,计算比较等场景首先来了解GO语言里非常浪漫的一个点,即2006-01-0215:04:05,GO语言诞生的时间,通常用来做时间的格式化time转stringt:=time.Now()//当前时间timeLayoutStr:="2006-01-0215:04:05"t.Format(timeLayoutStr)//返回值为string,可以用一个值来接收它上述例子中,将time类型t转换为string类型,并格式化为年-月-日时-分-秒,这里的格式化是可

  7. 加载脚本时何时使用异步与延期? - 2

    因此,我最近了解到,将您的JS放在DOM的底部是过时的,我应该再次将它们放在具有“异步”和“递延”属性。伟大的。但是,根据优先级,我对应该使用的是有点困惑。所以我有:jQuery对页面外观没有立即影响的jQuery插件确实对页面外观有直接影响的jQuery插件我自己的个人脚本,对页面的外观有直接影响,也依赖于jQuery哪个应该得到异步,哪个应该延期?如果我正确理解所有这些,那么对网站的外观没有立即影响的所有这些都应该延迟,而其他所有内容都变得异步。正确的?还是我把这些混在一起了。看答案这很简单。您应该使用[async]对于可以按任何顺序执行的脚本,以及[defer]对于在解析HTML后必须执

  8. javascript - 社交插件(Fb、Twitter、Google)为我的网站增加了 3 秒的加载时间。推迟他们? - 2

    我知道您可以使用defer=""html属性来延迟javascript文件,但它仅在IE中受支持(笑),并且只会延迟javascript文件,我需要延迟整个插件的加载。有什么办法可以做到这一点吗?我喜欢Facebook集成等等,但是插件太慢了。它使加载时间增加了一倍以上。谢谢!~jacksonTweet注意:.socialplugins类仅用于在我的标题中定位。 最佳答案 以非阻塞方式动态加载javascript文件:http://berklee.github.com/nbl/或https://github.com/rgrove/l

  9. javascript - 使用哈希 url 卡在 Angular ui-router State.go 上? - 2

    我正在研究ui-router。我有一个状态:.state('new-personal-orders',{url:'/orders/new-personal-orders/:catId?',template:''})在我的Controller中,我可以使用$state.go('new-personal-orders',null,{reload:true})在Html文件中我有一个anchor标记:Link如果标签被点击,状态就会改变,'new-personal-orders'变成当前状态,在url中有尾随散列。然后url看起来像:http://localhost:3000/orders/

  10. javascript - 在请求之后推迟 React Render - 2

    我有一个正在加载初始状态的组件:getInitialState:function(){return{panel:"deals",showExtension:false,person:{}};},我有这个来找人:componentDidMount:function(){this.findPersonFromBackground();},findPersonFromBackground:function(){chrome.runtime.sendMessage({action:"findPerson",email:this.props.currentEmail.from_email},fu

随机推荐