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