Can meaningful values be returned from a defer'd function?

1,993 views
Skip to first unread message

Gbr

unread,
Mar 18, 2013, 1:36:01 PM3/18/13
to golan...@googlegroups.com
The language specification seems silent on what is returned from a defer'd function.  The current implementation appears to just return nil, making it difficult to determine the true outcome of the defer'd function. 

Is this correct? 

Will defer'd functions always return nil?  That is, is there any thought to allowing defer to return real values in later versions of Go?

Meanwhile, is there any alternative to handling this case other than isolating panics from opens in separate functions?

func handleWork() {
...
data, err := doWork()
if err != nil { handleProblem(data); }
if data == nil { return; }
processData(data)
...
}

func doWork() ([]byte, error) {

defer func() ([]byte, error) {
if err := recover(); err != nil {
return myDefault, myError // should not return nil, nil
}
return closeResources()  // can validly return nil, nil
}
...
openResources()
...
panicingFunction()
}

roger peppe

unread,
Mar 18, 2013, 1:39:00 PM3/18/13
to Gbr, golang-nuts
you can assign to named return values in a return.

func doWork() (data []byte, err error) {
defer func() {
if rerr := recover(); rerr != nil {
data, err = myDefault, rerr
}
}()
something()
}

Nate Finch

unread,
Mar 18, 2013, 2:14:15 PM3/18/13
to golan...@googlegroups.com, Gbr
On Monday, March 18, 2013 1:39:00 PM UTC-4, rog wrote:

you can assign to named return values in a return.

func doWork() (data []byte, err error) {
     defer func() {
         if rerr := recover(); rerr != nil {
              data, err = myDefault, rerr
         }
     }()
    something()
}

To expand on this - you very often should be deferring a closure (like rog is above), and thus can assign to variables that are accessible from inside the function, including named return values.

Ian Lance Taylor

unread,
Mar 18, 2013, 4:29:42 PM3/18/13
to roger peppe, Gbr, golang-nuts
And, to be clear, the return values of the deferred function, if any,
are ignored.

Ian

Gbr

unread,
Mar 19, 2013, 2:36:27 AM3/19/13
to golan...@googlegroups.com, roger peppe, Gbr
Got it.  Thanks to all for the help!

Gerald
Reply all
Reply to author
Forward
0 new messages