golang 语言协程
协程中使用全局变量、局部变量、指针、map、切片等作为参数时需要注意,此变量的值变化问题。 与for 循环,搭配使用更需谨慎。
1、内置函数时直接使用局部变量,未进行参数传递
func main() { for i := 0; i < 100; i++ { go func() { fmt.Println(i) }() } }
运行效果
func main() { for i := 0; i < 100; i++ { go func(i int) { fmt.Println(i) }(i) } }
运行效果
2、地址传递的参数
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 之后并非立即启动协程的。
补充:Go for循环 协程间传递参数的一个问题
看代码吧~
map1 := make(map[int]int) for i:=0; i<3; i++{ map1[i] = i+1 } fmt.Println(map1) for k, v := range map1{ go func(key, value int){ fmt.Println("one way :", key, " : ", value) }(k, v) go func(){ time.Sleep(time.Second) fmt.Println("another way :", k, " : ", v) }() }
输出:
map[2:3 0:1 1:2] one way : 1 : 2 one way : 0 : 1 one way : 2 : 3 another way : 2 : 3 another way : 2 : 3 another way : 2 : 3
这看起来跟 js 里面的 for 循环匿名函数传参的问题差不多。就是说匿名函数真正执行的时候,传入形参的值已经确定。
如果想要达到想要的效果需要进行第一种传参形式。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
更新日志
2024年11月22日
2024年11月22日
- 张梦弘《大城小爱HQ》头版限量编号[低速原抓WAV+CUE]
- 张敬轩《MY 1ST COLLECTION》2CD[WAV+CUE][1.7G]
- 张玮伽《夜归人HQⅡ》2024头版限量编号[WAV+CUE][523M]
- 证声音乐图书馆《夏至 爵士境地》[320K/MP3][70.37MB]
- 孙露《同名专辑》限量1:1母盘直刻[低速原抓WAV+CUE]
- 【宝丽金唱片】群星《鼓舞飞扬》WAV+CUE
- 莫扎特弗雷德沃夏克肖斯塔科维奇《钢琴五重奏》(DG24-96)FLAC
- 证声音乐图书馆《夏至 爵士境地》[FLAC/分轨][360.16MB]
- 证声音乐图书馆《日落琴声 x 弦乐》[320K/MP3][71.2MB]
- 证声音乐图书馆《日落琴声 x 弦乐》[FLAC/分轨][342.58MB]
- 谢采妘2011《难忘的旋律(Non-StopChaCha)》马来西亚版[WAV+CUE]
- 林翠萍《听见林翠萍,记忆就会醒来》2CD[WAV+CUE]
- 木村好夫《天龍HIFI木吉他、木村好夫精选好歌》日本天龙版[WAV整轨]
- 证声音乐图书馆《日出琴声 x 民谣》[320K/MP3][53.76MB]
- 证声音乐图书馆《日出琴声 x 民谣》[FLAC/分轨][239.29MB]