大佬教程收集整理的这篇文章主要介绍了Defer, Panic, and Recover,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
工作之后两年多没写过博客了,给自己找了一个忙的借口,快过年了,有点时间,最近学习go语言,习惯于学习官方文档,发现
https://blog.golang.org/defer-panic-and-recover
这篇文章没有翻译版本,可能会延长学习的时间成本,就翻译了一下,翻译的不妥请大家指正
Defer,Panic,and Recover
func CopyFile(dstName,srcName String) (written int64,err error) { src,err := os.Open(srcName) if err != nil { return } dst,err := os.Create(dstName) if err != nil { return } written,err = io.Copy(dst,srC) dst.Close() src.Close() return }
func CopyFile(dstName,err := os.Open(srcName) if err != nil { return } defer src.Close() dst,err := os.Create(dstName) if err != nil { return } defer dst.Close() return io.Copy(dst,srC) }
func a() { i := 0 defer fmt.Println(i) i++ return }
func b() { for i := 0; i < 4; i++ { defer fmt.Print(i) } }
func c() (i int) { defer func() { i++ }() return 1 }
package main import "fmt" func main() { f() fmt.Println("Returned normally from f.") } func f() { defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f",r) } }() fmt.Println("Calling g.") g(0) fmt.Println("Returned normally from g.") } func g(i int) { if i > 3 { fmt.Println("Panicking!") panic(fmt.Sprintf("%v",i)) } defer fmt.Println("Defer in g",i) fmt.Println("PrinTing in g",i) g(i + 1) }
Calling g. PrinTing in g 0 PrinTing in g 1 PrinTing in g 2 PrinTing in g 3 Panicking! Defer in g 3 Defer in g 2 Defer in g 1 Defer in g 0 Recovered in f 4 Returned normally from f.
Calling g. PrinTing in g 0 PrinTing in g 1 PrinTing in g 2 PrinTing in g 3 Panicking! Defer in g 3 Defer in g 2 Defer in g 1 Defer in g 0 panic: 4 panic PC=0x2a9cd8 [stack trace omitted]
printHeader() defer printFooter()
综上所述,defer语句(无论是否和panic与recover一起使用)提供了一套不同寻常但是有力的流程控制机制。这一机制可以用来规范其他语言的一大批使用特殊结构完成的功能,可以尝试一下。
英文版原作者:Andrew Gerrand@H_607_117@
以上是大佬教程为你收集整理的Defer, Panic, and Recover全部内容,希望文章能够帮你解决Defer, Panic, and Recover所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。