Closure
var i int 這個 local variable 被此 goroutine給 hold 住
https://go.dev/play/p/-Z2EYqFPJ4O
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
incr := func(wg *sync.WaitGroup) {
var i int
wg.Add(1)
go func() {
defer wg.Done()
i++
fmt.Printf("value of i: %v\n", i)
}()
fmt.Println("return from function")
return
}
incr(&wg)
wg.Wait()
fmt.Println("done..")
}
return from function
value of i: 1
done..
Example2
Problem
https://go.dev/play/p/5XsP0XI9JNB
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
// what is the output
//TODO: fix the issue.
for i := 1; i <= 3; i++ {
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println(i)
}()
}
wg.Wait()
}
Solution
https://go.dev/play/p/YMsCI_sIcxJ
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
// what is the output
// fix the issue.
for i := 1; i <= 3; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println(i)
}(i)
}
wg.Wait()
}