I understand, thanks. On Sat, Aug 26, 2023, 18:47 Brian Candler <b.cand...@pobox.com> wrote:
> In both cases, the argument inside parenthesis is evaluated at the time > "defer" is executed - as indeed is the value of "p". > > In the first case, you wrote "defer p.close(err)". Since err is nil at > this point, at the end of the function body, p.close(nil) is called. > > In the second case, you wrote "defer p.close(pt)" where pt is a pointer to > some variable. Therefore, at the end of the function body, p.close(pt) is > called, with the value of the pointer at that time. > > Since in the second case you have a valid pointer to some data, then you > can modify that data through the pointer. Note that if the pointer pt had > changed, it would still be referring to the original value of pt, since > that was captured at the time "defer" was called. > > Maybe this clarifies? > https://go.dev/play/p/T2OXfmh-slj > > On Saturday, 26 August 2023 at 16:37:43 UTC+1 Aln Kapa wrote: > >> Well here is the code that works as I need, what is wrong with the >> previous one ? >> https://go.dev/play/p/ZW-GmEP5uqu >> >> package main >> >> import ( >> >> "fmt" >> ) >> >> type process struct { >> } >> >> func (p *process) close(err any) { >> v, _ := err.(*int) >> if *v == 1 { >> >> fmt.Println("error") >> } else { >> fmt.Println("no error") >> } >> } >> func Handle(b bool) { >> p := process{} >> var i = 2 >> var pt any = &i >> defer func() { >> p.close(pt) >> }() >> if b { >> i = 1 >> >> } >> } >> >> func HandleWTF(b bool) { >> p := process{} >> var i = 2 >> var pt any = &i >> defer p.close(pt) >> if b { >> i = 1 >> >> } >> } >> >> func main() { >> Handle(true) // error >> Handle(false) // no error >> HandleWTF(true) // error >> } >> >> >> On Sat, Aug 26, 2023 at 6:10 PM Brian Candler <b.ca...@pobox.com> wrote: >> >>> 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...@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 >>> <https://groups.google.com/d/msgid/golang-nuts/25846715-b3bf-4d1d-81b4-4a2799e69d27n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- > 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/75285ba7-f9aa-4d43-b136-9c3d676c9891n%40googlegroups.com > <https://groups.google.com/d/msgid/golang-nuts/75285ba7-f9aa-4d43-b136-9c3d676c9891n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- 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/CAJqqVEVpyxRjBTmg%3DrAs3y9GZf7AJUniB08jxe4rh3VbYkjWOA%40mail.gmail.com.