Your assignments in the deferred function are to the local
variable `err`, not the return value of `Execute` -- you can't
change the return value in the deferred function unless it
has a name.

You want to write

    func Execute() (err error) {
        defer func() {
...

Now the return value is named and can be updated in the
body of the deferred function.










On 11 October 2016 at 11:16, Henry <henry.adisuma...@gmail.com> wrote:
> 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.



-- 
Chris "allusive" Dollin

-- 
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