GoLang range 的坑

错误

values := []string{"a", "b", "c"}
for _, v := range values {
	go func() {
		fmt.Println(v)
	}()
}
// out: c
// 只输出了一个c,或者啥也没输出

原因:

在 for 中开启 goroutine

其在 main goroutine 运行完成之后,可能其它 goroutine 还没有得到运行机会,就结束了,就会啥也没输出

只输出一个C,应该是在 goroutine中取到的 变量地址,也有可能是for循环到最后一个元素之后,其它goroutine才运行,这时取到的就是最后一个值

解决:

for _, v := range values {
        go func(u string) {
            fmt.Println(u)
       }(v)  //明确值复制,作为栈变量
}

错误:

list := make(map[int]*Link)
for _, lnk := range linktree {
       list[lnk.Code] = &lnk
}

解决:

list := make(map[int]*Link)
for _, lnk := range linktree {
   var lnk = linktree  
     list[lnk.Code] = &lnk 
}