并发任务

    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        worker("hello")
        wg.Done()
    }()
    go func() {
        worker("world")
        wg.Done()
    }()
    wg.Wait()
go fn 并发任务发在正常最前面
除了for range还支持
select {
    case <- ch1:
        // do something if read from ch1
    case x := <-ch2:
        // do something if read from ch2, and assign value to x
    case ch3 <- y:
        // do something if can write to ch3
    default:
        // do something if none of the above happens
}
//并发scile结构体
    type Demo struct {
        Name string
    }
    lists := []Demo{
        {
            "中国",
        },
        {
            "美国",
        },
    }
    wg := sync.WaitGroup{}
    for _, v := range lists {
        wg.Add(1)
        //并发正确传值
        go func(v Demo) {
            defer wg.Done()
            fmt.Println("name=", v.Name)
        }(v)
    }
    wg.Wait()
安全map,并发用,普通的报错
wg := sync.WaitGroup{}
    m := sync.Map{}
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(i int) {
            m.Store(i, i+1)
            value, _ := m.Load(i)
            fmt.Println(i, value)
            wg.Done()
        }(i)
    }
    wg.Wait()
//gf中并发安全
wg := sync.WaitGroup{}
    m := gmap.New(true)
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func(i int) {
            m.Set(i, i+1)
            value := m.Get(i)
            fmt.Println(i, value)
            wg.Done()
        }(i)
    }
    wg.Wait()
//并发读取scile,不会丢失
    wg := sync.WaitGroup{}
    m := []int{1, 5, 7, 8, 56, 77, 777, 88, 85, 89}
    ch := make(chan int, 1)
    for v := range m {
        wg.Add(1)
        go func(v int) {
            ch <- 1
            fmt.Println(v, m[v])
            <-ch
            wg.Done()
        }(v)
    }
    wg.Wait()
//并发scile写数据,不会丢失
    wg := sync.WaitGroup{}
    m := []int{}
    ch := make(chan int, 1)
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func(i int) {
            ch <- 1
            m = append(m, i)
            <-ch
            wg.Done()
        }(i)
    }
    wg.Wait()
//gf中 并发scile写数据,不会丢失
    wg := sync.WaitGroup{}
    m := garray.NewIntArray(true)
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func(i int) {
            m.Append(i)
            wg.Done()
        }(i)
    }
    wg.Wait()
//切片并发读取
list := []int{1, 2, 3}
    for _, v := range list {
        go func(v int) {
            fmt.Println(v)
        }(v)
    }

    for {
    }
文档更新时间: 2021-12-30 11:02   作者:Yoby