Yes, that's correct. It does look a bit odd doesn't it. As you say it's because the w.Count() gets evaluated by the select each time around the loop and so the count gets reset to 0.
Probably the best way to fix that is to make Count() non-destructive and have an explicit Clear function that gets called when a count has been delivered.
It's almost like sometimes it would have handy to do
case ch <- defer foo():
and only have foo() be evaluated if ch is ready for writing and also chosen amongst the cases. As the (fixed) code stands either the Sprintf() and Sum() or Count() is wasted on each iteration. I suppose in some cases you can calculate the initial values before the for-loop and then replenish them in the case: when they're used.
Probably the best way to fix that is to make Count() non-destructive and have an explicit Clear function that gets called when a count has been delivered.
Like this: http://play.golang.org/p/LWVvdhwBiQ
Since this blog post is likely to be around for a while I will update the code.