I just ran into an issue with a closure inside a function that I originally 
created elsewhere with the same names as where I transplanted the closure 
definition, and it took me quite some time to root out all the references 
to the outer scope.

Scope bleed and shadowing with closures is something that should be 
emphasised as an issue when dealing with closures, especially when it 
involves context variables.

I found a way to exploit the scoping rules to rapidly highlight all the 
incorrectly unchanged references to outer scope context by creating an 
inner scope declaration of a variable of a different type with the name of 
this overlapping outer scope, in this case an int. Then instantly all the 
references inside the closure referring to this outer name have been 
changed to be int type and become type/member errors. 

Unfortunately I didn't figure it out until I had just finally nabbed the 
last one, but hopefully I will remember it for future and that maybe it 
helps someone else who uses closures a lot in Go.

The code is inside a configuration menu system I am writing and it uses 
closures to attach handlers to objects. 

I have learned two important scoping rules that goes beyond just closures 
in the process;

1. It is possible to declare a name inside a block same as outside the 
block with no limitations (thus using the outer name to zap incorrect 
lingering references inside a closure).
2. For variables are not multiply declared - inside a closure a reference 
to variables declared using := in a for statement are a single variable and 
usually means the closure has only the last value in the iteration in its 
references to these values. You have to declare a new variable inside the 
for statement to ensure it pins to the specific instance of the loop and 
the state at that time.

I also observed a while ago and it can be annoying sometimes (and sometimes 
actually there is no better way to express) than an if/else if/else 
construction, one has to be aware in that case that the if{}else{}else{} is 
a contiguous scope block and all names declared either in the optional if 
statement or inside the blocks can be seen by the others. I think this 
visibility is progressive, ie you can't see the variable declared in the 
next else if{} block, only the ones beforehand.

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to