github.com/huandu/go@v0.0.0-20151114150818-04e615e41150/doc/progs/defer2.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This file contains the code snippets included in "Defer, Panic, and Recover." 6 7 package main 8 9 import "fmt" 10 import "io" // OMIT 11 import "os" // OMIT 12 13 func main() { 14 f() 15 fmt.Println("Returned normally from f.") 16 } 17 18 func f() { 19 defer func() { 20 if r := recover(); r != nil { 21 fmt.Println("Recovered in f", r) 22 } 23 }() 24 fmt.Println("Calling g.") 25 g(0) 26 fmt.Println("Returned normally from g.") 27 } 28 29 func g(i int) { 30 if i > 3 { 31 fmt.Println("Panicking!") 32 panic(fmt.Sprintf("%v", i)) 33 } 34 defer fmt.Println("Defer in g", i) 35 fmt.Println("Printing in g", i) 36 g(i + 1) 37 } 38 39 // STOP OMIT 40 41 // Revised version. 42 func CopyFile(dstName, srcName string) (written int64, err error) { 43 src, err := os.Open(srcName) 44 if err != nil { 45 return 46 } 47 defer src.Close() 48 49 dst, err := os.Create(dstName) 50 if err != nil { 51 return 52 } 53 defer dst.Close() 54 55 return io.Copy(dst, src) 56 } 57 58 // STOP OMIT