下面代码输出什么?
func main() {
list := []string{"pi", "big", "star"}
for _, l := range list {
go func() {
fmt.Print(l)
}()
}
time.Sleep(1 * time.Second)
}
长按查看答案:starstarstar
❝for range创建了每个元素的副本,而不是直接返回每个元素的引用,在迭代时,返回的变量是一个迭代过程中根据切片依次赋值的新变量,所以它的值的地址其实是同一个,这也就导致当for循环结束后,其
❞l
的地址的值已经被改成star
了,这也就导致后面goroutine中输出的都是 star
解决方案有两个: 1是重新赋值, 2是将值传递给goroutine中,这里更推荐使用方案2
方案1
func main() {
list := []string{"pi", "big", "star"}
for _, l := range list {
l := l // l 是一个新地址
go func() {
fmt.Print(l)
}()
}
time.Sleep(1 * time.Second)
}
方案2
func main() {
list := []string{"pi", "big", "star"}
for _, l := range list {
go func(l string) {
fmt.Print(l)
}(l)
}
time.Sleep(1 * time.Second)
}
PS: 投稿专道已经开启,欢迎大家踊跃投稿啊(基本只要投就会被选中喔~)
往期推荐
Go踩坑笔记(四)
Go踩坑笔记(五)
Go踩坑笔记(六)
Go踩坑笔记(七)
Go踩坑笔记(八)
Go写一个内网穿透工具
你点的每一个在看,我都认真当成了喜欢