Go by Example ไธญๆ–‡็‰ˆ: Defer

Defer ็”จไบŽ็กฎไฟ็จ‹ๅบๅœจๆ‰ง่กŒๅฎŒๆˆๅŽ๏ผŒไผš่ฐƒ็”จๆŸไธชๅ‡ฝๆ•ฐ๏ผŒไธ€่ˆฌๆ˜ฏๆ‰ง่กŒๆธ…็†ๅทฅไฝœใ€‚ Defer ็š„็”จ้€”่ทŸๅ…ถไป–่ฏญ่จ€็š„ ensure ๆˆ– finally ็ฑปไผผใ€‚

package main
import (
    "fmt"
    "os"
)

ๅ‡่ฎพๆˆ‘ไปฌๆƒณ่ฆๅˆ›ๅปบไธ€ไธชๆ–‡ไปถใ€็„ถๅŽๅ†™ๅ…ฅๆ•ฐๆฎใ€ๆœ€ๅŽๅœจ็จ‹ๅบ็ป“ๆŸๆ—ถๅ…ณ้—ญ่ฏฅๆ–‡ไปถใ€‚ ่ฟ™้‡Œๅฑ•็คบไบ†ๅฆ‚ไฝ•้€š่ฟ‡ defer ๆฅๅšๅˆฐ่ฟ™ไธ€ๅˆ‡ใ€‚

func main() {

ๅœจ createFile ๅŽ็ซ‹ๅณๅพ—ๅˆฐไธ€ไธชๆ–‡ไปถๅฏน่ฑก๏ผŒ ๆˆ‘ไปฌไฝฟ็”จ defer ้€š่ฟ‡ closeFile ๆฅๅ…ณ้—ญ่ฟ™ไธชๆ–‡ไปถใ€‚ ่ฟ™ไผšๅœจๅฐ้—ญๅ‡ฝๆ•ฐ๏ผˆmain๏ผ‰็ป“ๆŸๆ—ถๆ‰ง่กŒ๏ผŒๅณ writeFile ๅฎŒๆˆไปฅๅŽใ€‚

    f := createFile("/tmp/defer.txt")
    defer closeFile(f)
    writeFile(f)
}
func createFile(p string) *os.File {
    fmt.Println("creating")
    f, err := os.Create(p)
    if err != nil {
        panic(err)
    }
    return f
}
func writeFile(f *os.File) {
    fmt.Println("writing")
    fmt.Fprintln(f, "data")
}

ๅ…ณ้—ญๆ–‡ไปถๆ—ถ๏ผŒ่ฟ›่กŒ้”™่ฏฏๆฃ€ๆŸฅๆ˜ฏ้žๅธธ้‡่ฆ็š„๏ผŒ ๅณไฝฟๅœจ defer ๅ‡ฝๆ•ฐไธญไนŸๆ˜ฏๅฆ‚ๆญคใ€‚

func closeFile(f *os.File) {
    fmt.Println("closing")
    err := f.Close()
    if err != nil {
        fmt.Fprintf(os.Stderr, "error: %v\n", err)
        os.Exit(1)
    }
}

ๆ‰ง่กŒ็จ‹ๅบ๏ผŒ็กฎ่ฎคๅ†™ๅ…ฅๆ•ฐๆฎๅŽ๏ผŒๆ–‡ไปถๅทฒๅ…ณ้—ญใ€‚

go run defer.go
creating
writing
closing

ไธ‹ไธ€ไธชไพ‹ๅญ: Recover