zoukankan      html  css  js  c++  java
  • go协程使用陷阱(转)

      协程中使用全局变量、局部变量、指针、map、切片等作为参数时需要注意,此变量的值变化问题。 与for 循环,搭配使用更需谨慎。

    1,内置函数时直接使用局部变量,未进行参数传递

    package  main
    
    import "fmt"
    
    func main() {
        for i := 0;i < 100; i++{
            go func() {
                fmt.Println(i)
            }()
        }
    
    }

    原因分析:

      协程开启时候,可能多个协程拿到的变量i是同一个,这就导致输出结果的不准确。

    解决方案:

    package  main
    
    import "fmt"
    
    func main() {
        for i := 0;i < 100; i++{
            go func(i int) {
                fmt.Println(i)
            }(i)
        }
    
    }

    2,地址传递的参数

    package  main
    
    import "fmt"
    
    type Per struct {
        name string
        bh int
    }
    
    func main() {
        p := &Per{}
    
        for i := 0;i< 100; i++{
            p.bh = i
            go func(p *Per) {
                fmt.Println(p)
            }(p)
        }
    }

    分析:go 并发并非立即启动协程。

  • 相关阅读:
    Search in Rotated Sorted Array
    Search insert position
    二分法感悟
    The Smallest Difference
    Lintcode: Nuts & Bolts Problem
    167. Two Sum II
    登录页面
    注册页面
    在线版简易计算器
    简单工厂模式
  • 原文地址:https://www.cnblogs.com/vipchenwei/p/9462572.html
Copyright © 2011-2022 走看看