请教一个很基本的 goroutine 问题

2017-06-11 23:09:17 +08:00
 Adia

第一段代码:

package main

import (
	"fmt"
	"time"
)

func main() {
	names := []string{"Eric", "Harry", "Robert", "Jim", "Mark"}
	for _, name := range names {
		go func() {
			fmt.Printf("Hello, %s!\n", name)
		}()
	}
	time.Sleep(time.Millisecond)
}

结果:

package main

import (
	"fmt"
	"time"
)

func main() {
	names := []string{"Eric", "Harry", "Robert", "Jim", "Mark"}
	for _, name := range names {
		go func() {
			fmt.Printf("Hello, %s!\n", name)
		}()
	}
	time.Sleep(time.Millisecond)
}

第二段代码:

package main

import (
	"fmt"
	"time"
)

func main() {
	names := []string{"Eric", "Harry", "Robert", "Jim", "Mark"}
	for _, name := range names {
		go func(who string) {
			fmt.Printf("Hello, %s!\n", who)
		}(name)
	}
	time.Sleep(time.Millisecond)
}

结果:

package main

import (
	"fmt"
	"time"
)

func main() {
	names := []string{"Eric", "Harry", "Robert", "Jim", "Mark"}
	for _, name := range names {
		go func(who string) {
			fmt.Printf("Hello, %s!\n", who)
		}(name)
	}
	time.Sleep(time.Millisecond)
}

问题

为什么第二段就能正常的迭代了呢?

688 次点击
所在节点    Go 编程语言
4 条回复
Adia
2017-06-12 21:24:33 +08:00
up
CuminLo
2017-06-17 10:36:17 +08:00
没看懂?结果是?
Yoock
2017-06-18 18:16:49 +08:00
我觉得原因可能是每次 for range k 和 v 不是新建变量,而是变量复用。
所以每次不指定输出的字符串,并发输出 v 的话,都会变成最后一次 v 的值。
说的有点乱,希望你可以理解。
xinQing
2018-01-25 16:29:49 +08:00
闭包问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/367672

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX