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.

Reply via email to