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.

Reply via email to