You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.0 KiB
59 lines
1.0 KiB
4 months ago
|
// Copyright 2011 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
// This file contains the code snippets included in "Defer, Panic, and Recover."
|
||
|
|
||
|
package main
|
||
|
|
||
|
import "fmt"
|
||
|
import "io" // OMIT
|
||
|
import "os" // OMIT
|
||
|
|
||
|
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)
|
||
|
}
|
||
|
|
||
|
// STOP OMIT
|
||
|
|
||
|
// Revised version.
|
||
|
func CopyFile(dstName, srcName string) (written int64, err error) {
|
||
|
src, 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)
|
||
|
}
|
||
|
|
||
|
// STOP OMIT
|