Any arguments to defer functions are evaluated at the time that the defer 
is executed.  In HandleWTF, defer p.close(err) is called immediately after 
err is declared with value nil, so nil is what is used.

>From the specification <https://go.dev/ref/spec#Defer_statements>:

"Each time a "defer" statement executes, the function value and parameters 
to the call are evaluated as usual <https://go.dev/ref/spec#Calls> and 
saved anew but the actual function is not invoked."

On Saturday, 26 August 2023 at 15:58:06 UTC+1 Aln Kapa wrote:

> Hi All ! 
> Need some help, what am I doing wrong?
>
> https://go.dev/play/p/bBlA-i1CxNO
>
> // You can edit this code!
> // Click here and start typing.
> package main
>
> import (
> "errors"
> "fmt"
> )
>
> type process struct {
> }
>
> func (p *process) close(err error) {
> if err != nil {
> fmt.Println("error")
> } else {
> fmt.Println("no error")
> }
> }
> func Handle(b bool) {
> p := process{}
> var err error
> defer func() {
> p.close(err)
> }()
> if b {
> err = errors.New("err")
> }
> }
>
> func HandleWTF(b bool) {
> p := process{}
> var err error
> defer p.close(err)
> if b {
> err = errors.New("err")
> }
> }
>
> func main() {
> Handle(true)    // error
> Handle(false)   // no error
> HandleWTF(true) // no error ?????????
> }
>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/25846715-b3bf-4d1d-81b4-4a2799e69d27n%40googlegroups.com.

Reply via email to