Hi,

I stumbled upon this problem earlier and I wonder whether this is actually 
the intended behavior of defer or a bug.

Here is the code to illustrate the problem (or you can view it in the Go 
playground at https://play.golang.org/p/s2hdAmirrl ).

package main

import (
    "errors"
    "fmt"
)

func main() {
    err := Execute()
 
    //err is nil. I thought it is supposed to return the commit error?
    fmt.Printf("%v", err) 
}

func Execute() error {
    var err error
    defer func() {
       if err == nil {
          err = Commit()
       }
       if err != nil {
          Rollback()
       }
    }()

    err = Process()
    return err
}

func Process() error {
    return nil
}

func Commit() error {
    return errors.New("Mocked commit error")
}

func Rollback() {
}

It appears to me that defer works with the local copy of the variable, 
instead of a direct reference. I think as a rule I mustn't make 
any variable assignment in defer. I wonder whether this is by design.

Thanks.

Henry

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to