jjzjj

deferred

全部标签

go - 如何延迟函数返回的匿名函数

假设您有一个函数可以设置您的应用程序服务器并返回一个应该在您的应用程序退出之前立即运行的函数。funcmain(){deferapplicationExit()}funcapplicationExit()func(){fmt.Println("ApplicationSetupCall")returnfunc(){fmt.Println("ApplicationTearDownCall")}}您将获得以下输出。输出:应用程序设置调用出了什么问题?为什么我们看不到输出ApplicationTearDownCall 最佳答案 您的代码完全

go - 单个 defer func() 可以被其他函数共享吗?

我看到很多在函数内部使用deferfunc()的例子。有没有办法避免在不同的地方重复它并像普通函数一样调用它?在此示例(以及许多其他示例)中,延迟函数嵌套在另一个函数中:packagemainimport("fmt""os")funcmain(){deferfunc(){iferr:=recover();err!=nil{fmt.Fprintf(os.Stderr,"Exception:%v\n",err)os.Exit(1)}}()file,err:=os.Open(os.Args[1])iferr!=nil{fmt.Println("Couldnotopenfile")}fmt.P

如果 panic 之后,Golang defer 不起作用?

我有如下代码,但没有执行defer。如果我们把它放在panic之后,会不会延迟工作?packagemainimport("fmt")funcmain(){fmt.Println("beginingofmain")panic("stophere")deferfmt.Println("endofmain")}nghiatran@nghiatran-VB:~/go/src/defer$gorunmain.gobeginingofmainpanic:stopheregoroutine1[running]:main.main()/home/nghiatran/go/src/defer/main.

mongodb - 如何推迟 mgo session ,直到它完全流式传输到客户端?

我想在mgosession完全流式传输到客户端后关闭它。起初,我认为这可能行得通,但似乎defer只是等到func开始返回之类的。func(cApp)OpenFile(fileIdstring)revel.Result{//convertstringtobson.ObjectIdobjId:=bson.ObjectIdHex(fileId)file,session:=OpenFile(objId)defersession.Close()//memfileio.Reader,filenamestring,deliveryContentDisposition,modtimetime.Tim

go - 立即评估延迟调用的参数

在ATourofGo写成:Thedeferredcall'sargumentsareevaluatedimmediately,butthefunctioncallisnotexecuteduntilthesurroundingfunctionreturns.我很难理解引文的第一部分。什么叫立马?funcdef(sstring)func(){fmt.Println("tierup")fmt.Println(s)returnfunc(){fmt.Println("cleanup")}}funcmain(){deferdef("deferedline")()fmt.Println("main

signals - 是否可以以 "defer"方式捕获 Ctrl+C 信号 (SIGINT) 并运行清理功能?

我想捕获从控制台发送的Ctrl+C(SIGINT)信号并打印出一些部分运行总计。 最佳答案 您可以使用os/signal处理传入信号的包。Ctrl+C是SIGINT,因此您可以使用它来捕获os.Interrupt。c:=make(chanos.Signal,1)signal.Notify(c,os.Interrupt)gofunc(){forsig:=rangec{//sigisa^C,handleit}}()您使程序终止和打印信息的方式完全取决于您。 关于signals-是否可以以"d

go - 如果发生 panic 并在 golang 的 defer func(){...}() 中处理,如何使方法返回值

这个问题在这里已经有了答案:HowtoreturnavalueinaGofunctionthatpanics?(3个答案)关闭9个月前。无论是成功还是失败,我的函数都必须返回一个字符串。funcgetDBStoreStatus()string{varreplyMessagestringdeferfunc()string{iferr:=recover();err!=nil{replyMessage="Errorhappend."}returnreplyMessage}()//dosomethingtostorerowintoDBdb,err:=sql.Open("mysql","user

go - 在 golang 中重命名之前关闭文件

当我用golang做一些文件操作时,我首先打开一个文件并将close()添加到延迟列表中,然后我尝试重命名该文件。如果我手动关闭文件,延迟将再次关闭它。如果我等待延迟关闭它,重命名将导致错误,因为它没有关闭。代码如下funcmain(){pfile1,_:=os.Open("myfile.log")deferpfile1.Close()//Itwillbeclosedagain.......pfile1.Close()//Ihavetocloseitbeforerenameit.os.Rename("myfile.log","myfile1.log")}我发现了一些丑陋的解决方案,比如

go - Go 闭包捕获规则与 defer 有何不同?

以下Go代码演示了defer和go闭包之间闭包捕获规则的区别。在教程中,有人告诉我for循环变量的范围仅限于循环体,但这里似乎有所不同。packagemainimport"fmt"funcdeferred(){fori:=0;i这会产生输出:defer43210cps55555cpsCpy43210如果差异是有意为之,那么可以证明差异的不同用例是什么? 最佳答案 specfordefer对此很清楚。一般来说,规范对于任何关心变量捕获规则之类的东西的人来说都是至关重要的阅读,而且它的内容相对较短。这里说的是:Eachtimea"def

Go defer - 循环打开和复制文件

如果我在for循环中打开文件并将在该循环结束时完成它,我应该立即调用Close还是欺骗使用闭包延迟?我从chanstring中读取了一系列文件名,其中包含要复制到zip文件中的数据。这一切都在gofunc中处理。gofunc(fnames在我的for循环中,这样写会不会更地道:forfname:=rangefnames{func(){r,_:=os.Open(fname)deferr.Close()w,_:=zf.Create(r.Name())deferw.Close()io.Copy(w,r)}()}还是我应该继续编写我的代码? 最佳答案