- package main
-
- import (
- "fmt"
- "sync"
- "time"
- )
-
- type Node struct {
- Index int
- Id string
- }
-
- func main() {
- var nds []Node
- aa := 'a'
- for i := 0; i < 26; i++ {
- nds = append(nds, Node{Index: i, Id: string(aa)})
- aa += 1
- }
-
- wg := sync.WaitGroup{}
- for i, n := range nds {
- wg.Add(1)
- j := i
- d := n
- go func(jj int, dd *Node) {
- fmt.Printf("----i(%d)--n.Index(%d)--n.Id(%s)--\n", jj, dd.Index, string(dd.Id))
- time.Sleep(time.Second * 1)
- wg.Done()
- }(j, &d)
- }
- wg.Wait()
- }
-
输出如下:
- ----i(0)--n.Index(0)--n.Id(a)--
- ----i(1)--n.Index(1)--n.Id(b)--
- ----i(2)--n.Index(2)--n.Id(c)--
- ----i(11)--n.Index(11)--n.Id(l)--
- ----i(4)--n.Index(4)--n.Id(e)--
- ...
- ...
- ...
- ----i(3)--n.Index(3)--n.Id(d)--
- ----i(21)--n.Index(21)--n.Id(v)--
- ----i(22)--n.Index(22)--n.Id(w)--
- ----i(23)--n.Index(23)--n.Id(x)--
- ----i(24)--n.Index(24)--n.Id(y)--
- ----i(25)--n.Index(25)--n.Id(z)--
-
在标准版的基础上,使用 互斥锁:
在for循环外添加: lock := sync.Mutex{}
在for循环内的goroutine里面使用: lock.Lock() 和 defer lock.Unlock()
循环内不再定义新变量,写法改为:
- for i, n := range nds {
- wg.Add(1)
- go func(jj int, dd *Node) {
- fmt.Printf("----i(%d)--n.Index(%d)--n.Id(%s)--\n", jj, dd.Index, string(dd.Id))
- time.Sleep(time.Second * 1)
- wg.Done()
- }(i, &n)
- }
-
输出如下:
- ----i(1)--n.Index(4)--n.Id(e)--
- ----i(25)--n.Index(25)--n.Id(z)--
- ----i(4)--n.Index(25)--n.Id(z)--
- ----i(5)--n.Index(25)--n.Id(z)--
- ----i(6)--n.Index(25)--n.Id(z)--
- ...
- ...
- ...
- ----i(11)--n.Index(25)--n.Id(z)--
- ----i(21)--n.Index(25)--n.Id(z)--
- ----i(23)--n.Index(25)--n.Id(z)--
- ----i(22)--n.Index(25)--n.Id(z)--
- ----i(24)--n.Index(25)--n.Id(z)--
-
最后上一个菜鸟版的错误写法:
- for i, n := range nds {
- wg.Add(1)
- go func() {
- fmt.Printf("----i(%d)--n.Index(%d)--n.Id(%s)--\n", i, n.Index, string(n.Id))
- time.Sleep(time.Second * 1)
- wg.Done()
- }()
- }
-
输出:
- ----i(3)--n.Index(3)--n.Id(d)--
- ----i(25)--n.Index(25)--n.Id(z)--
- ----i(25)--n.Index(25)--n.Id(z)--
- ----i(25)--n.Index(25)--n.Id(z)--
- ----i(25)--n.Index(25)--n.Id(z)--
- ......
- ----i(25)--n.Index(25)--n.Id(z)--
- ----i(25)--n.Index(25)--n.Id(z)--
- ----i(25)--n.Index(25)--n.Id(z)--
- ----i(25)--n.Index(25)--n.Id(z)--
- ----i(25)--n.Index(25)--n.Id(z)--
-
go并发编程-for循环中go协程常见问题总结 https://segmentfault.com/a/1190000042559237