IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    go语句参数传递

    mckee发表于 2016-07-14 11:42:07
    love 0

    一条go语句就意味着并发执行一个函数。当循环迭代执行go语句时,要注意参数传递常见的一个疏忽。
    如下:

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	langs :=[]string {"java", "php", "golang"}
    	for _,lang := range langs {
    		go func() {
    			fmt.Println(lang)
    		}()
    	}
    	time.Sleep(time.Second)
    }

    结果打印的全是golang字符串,跟我们预期不一样。
    这是因为每次迭代都会给变量lang赋值,当迭代完毕后,3个goroutine还没有执行,当执行是而变量lang的值是最后一次迭代的值。
    如果不想使用外部变量,可以通过添加参数:
    func main() {
    	langs :=[]string {"java", "php", "golang"}
    	for _,lang := range langs {
    		go func(lang string) {
    			fmt.Println(lang)
    		}(lang)
    	}
    	time.Sleep(time.Second)
    }



沪ICP备19023445号-2号
友情链接