はい!今やってます!

Work Pertly, Live Idly

無名関数の中でdeferを呼んだ時の動作の検証

  • Code
package main

import (
    "fmt"
    "errors"
)

func main() {
    fmt.Println("---- main start ----")
    
    var err error
    defer func() {
        fmt.Println("---- main defer start ----")
        if err != nil {
            fmt.Println("--> err in main defer")
            fmt.Println(err)
            
        }
        fmt.Println("---- main defer end ----")
    }()
    
    anonymous := func() (err error) { 
    
        defer func() {
            fmt.Println("---- anonymous defer start ----")
            if err != nil {
                fmt.Println(err)
            }
            fmt.Println("---- anonymous defer end ----")
        }()
        
        fmt.Println("---- anonymous start ----")
        err = errors.New("anonymous error occured")
        return
        
    }
    err = noname()
    
    fmt.Println("---- main end ----")
}
  • Result
---- main start ----
---- anonymous start ----
---- anonymous defer start ----
anonymous error occured
---- anonymous defer end ----
---- main end ----
---- main defer start ----
--> err in main defer
anonymous error occured
---- main defer end ----