• 循环开协程情况分析


    循环开协程情况分析

    • 代码

    package main
    
    import(
    	"fmt"
    	"runtime"
    	"sync"
    )
    
    
    //for循环只是用来创建协程而已,当协程创建完成之后,就不再受for控制
    func main(){
    	runtime.GOMAXPROCS(1)
    	wg := sync.WaitGroup{}
    	wg.Add(60)
    	for a:=0;a<10;a++{
    		fmt.Println("这里先运行",a)
    		go func(){
    			defer wg.Done()
    			fmt.Printf("a的地址: %p , %v 
    ",&a,a)
    		}()
    	}
    	
    	for i:=10;i<20;i++{
    		go func(i int){
    			defer wg.Done()
    			fmt.Printf(" i的地址: %p , %v 
    ",&i,i)
    		}(i)
    	}
    	wg.Wait()
    	fmt.Println("想看运行结果")
    }
    
    • 输出结果

    这里先运行 0
    这里先运行 1
    这里先运行 2
    这里先运行 3
    这里先运行 4
    这里先运行 5
    这里先运行 6
    这里先运行 7
    这里先运行 8
    这里先运行 9
     i的地址: 0xc000010158 , 19
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
     i的地址: 0xc0000101c8 , 10
     i的地址: 0xc0000101d8 , 11
     i的地址: 0xc0000101e8 , 12
     i的地址: 0xc0000101f8 , 13
     i的地址: 0xc000010208 , 14
     i的地址: 0xc000010218 , 15
     i的地址: 0xc000010228 , 16
     i的地址: 0xc000010238 , 17
     i的地址: 0xc000010248 , 18
    想看运行结果
    
    C:Users悟Desktopstudygo	estwaitGroup>go run main.go
    这里先运行 0
    这里先运行 1
    这里先运行 2
    这里先运行 3
    这里先运行 4
    这里先运行 5
    这里先运行 6
    这里先运行 7
    这里先运行 8
    这里先运行 9
     b的地址: 0xc000010158 , 19
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
    a的地址: 0xc000010038 , 10
     b的地址: 0xc0000101c8 , 10
     b的地址: 0xc0000101d8 , 11
     b的地址: 0xc0000101e8 , 12
     b的地址: 0xc0000101f8 , 13
     b的地址: 0xc000010208 , 14
     b的地址: 0xc000010218 , 15
     b的地址: 0xc000010228 , 16
     b的地址: 0xc000010238 , 17
     b的地址: 0xc000010248 , 18
    想看运行结果
    
    • 现象说明

      • a的值为什么会是一样?
        • 第一个go func中a是外部变量,因为协程运行时间不确定性,可能此时for循环完之后,才创建完协程,而此时得a=10,协程操作的也是这个变量。因此值会是一样的。
      • b的值为什么会不一样?
        • 第二个go func中b是函数参数,与外部for中的i完全是两个变量。尾部(i)将发生值拷贝,go func内部将值拷贝。
      • b的值输出不按顺序
        • 这里的协程顺序是不固定的
    • 总结

      • 协程想要调用外部的值的时候,尽量使用参数传递的方式。

      • 一个地址不可能存有两个值

  • 相关阅读:
    产品列表
    PHP全栈学习笔记5
    PHP全栈学习笔记5
    PHP全栈学习笔记4
    更新YUM源后的arning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY错误
    监听EditText输入完成
    关于PHP接收HTTP模拟POST传JSON格式时$_POST为空的问题
    安卓时间类型的转换和比大小
    Android之观察者/被观察者模式Observer/Observable
    WKWebView--JS调用OC的方法
  • 原文地址:https://www.cnblogs.com/MyUniverse/p/11577357.html
Copyright © 2020-2023  润新知