教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go协程全局变量和局部变量

go协程全局变量和局部变量

发布时间:2022-03-04   编辑:jiaochengji.com
教程集为您提供go协程全局变量和局部变量等资源,欢迎您收藏本站,我们将为您提供最新的go协程全局变量和局部变量资源

大家可能经常会用到类似如下代码片段:

<pre>package main import (   "fmt"    "sync"    "time") func main() {    sli := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}    wg := sync.WaitGroup{}   for k, v := range sli {       wg.Add(1)       go func() {          time.Sleep(time.Second)          fmt.Println(k, v)          wg.Done()       }()    }    wg.Wait() }</pre>

打印输出:

<pre>9 99 99 99 99 99 99 99 99 99 9</pre>

结果是不是和想象的不一样?,主要原因出在协程这里,如果不使用协程,直接使用串行的方式,结果结合预期一致,比如:

<pre>package main import (   "fmt"    "time") func main() {    sli := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}   for k, v := range sli {       func() {          time.Sleep(time.Second)          fmt.Println(k, v)       }()    } }</pre>

打印输出:

<pre>0 01 12 23 34 45 56 67 78 89 9</pre>

那为什么上面使用携程的输出都是相同值?我们来解读下:
其中 k, v 是迭代变量,每次迭代都会给 k, v 赋值新的值,并且多个协程又同时调用了 k, v ,所以结果就串了,那携程怎么解决?解决方式我们可以定义一个局部变量。

<pre>package main import (   "fmt"    "sync"    "time") func main() {    sli := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}    wg := sync.WaitGroup{}   for k, v := range sli {       wg.Add(1)       k1 := k       v1 := v       go func() {          time.Sleep(time.Second)          fmt.Println(k1, v1)          wg.Done()       }()    }    wg.Wait() }</pre>

k1, v1 是局部变量,每次循环,循环体内是不共享的,这也是为什么可以这样声明变量(k1 := k)。

或者通过传参的方式来固定下来,比如像下面这样:

<pre>package main import (   "fmt"    "sync"    "time") func main() {    sli := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}    wg := sync.WaitGroup{}   for k, v := range sli {       wg.Add(1)       go func(k, v interface{}) {          time.Sleep(time.Second)          fmt.Println(k, v)          wg.Done()       }(k, v)    }    wg.Wait() }</pre>

这样输出就正常,比如输出如下:

<pre>0 05 52 23 34 41 19 96 68 87 7</pre>

 


到此这篇关于“go协程全局变量和局部变量”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
python全局变量和局部变量的区别
DB2实例级概要文件注册表的疑问
谈谈PHP中的global全局变量
php变量的作用域
php global static与$GLOBALS的区别
golang 全局变量
Python变量作用域
Javascript声明全局变量的三种方法
go协程全局变量和局部变量
php中static 静态变量和普通变量的区别

[关闭]
~ ~