🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## range陷阱 range使用规则: 1. 循环变量是易变的 语句`for index, value := range xxx`中,每次循环index和value都会被重新赋值(并非生成新的变量)。 如果循环体中会启动协程(并且协程会使用循环变量),就需要格外注意了,因为很可能循环结束后协程才开始执行, 此时,所有协程使用的循环变量有可能已被改写。(是否会改写取决于引用循环变量的方式) 2. 循环变量需要绑定 ### 题目一 ~~~golang func Process1(tasks []string) { for _, task := range tasks { // 启动协程并发处理任务 go func() { fmt.Printf("Worker start process task: %s\n", task) }() } } ~~~ 函数`Process1()`用于处理任务,每个任务均启动一个协程进行处理,输出可能是最后一个task ***** 【总结】 * 如果循环体没有并发出现,则引用循环变量一般不会出现问题; * 如果循环体有并发,则根据引用循环变量的位置不同而有所区别 * 通过参数完成绑定,则一般没有问题; * 函数体中引用,则需要显式地绑定