I had read various pages such as https://github.com/golang/go/wiki/CommonMistakes which outlined the issues with using closures and goroutines in a loop. As such I wrote my original loops as follows:

for outstanding < threads {
    ttl += 1;
    outstanding += 1;
    go func (ttl int, results chan Result) {
        results <- pw.SendTTL(ttl, dest)
        results <- pw.Recv(3)
    }(ttl, results)
}

Passing the changing TTL as an argument to the anonymous function. I ended up getting a random assortment of values over the range. Say if I was expecting 1-5 I'd get a couple 1's, a couple 3's, maybe a 4.

So I tried the following, in case there was something about specifically using the variable instantiated by the loop. Yes I know I'm sort of abusing the for loop here...

for i := ttl; outstanding < threads; i++ {
    go func (ttl int, results chan Result) {
        results <- pw.SendTTL(ttl, dest)
        results <- pw.Recv(3)
    }(i, results)
    outstanding++;
}

No joy. Same experience.

I also tried the other suggested option where you use a local variable in the loop, and use that within the closure. Same experience.

What am I doing wrong here? What boat did I miss?