V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Adia
V2EX  ›  Go 编程语言

请教一个很基本的 goroutine 问题

  •  
  •   Adia · 2017-06-11 23:09:17 +08:00 · 688 次点击
    这是一个创建于 2747 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第一段代码:

    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)
    }
    
    

    问题

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

    4 条回复    2018-01-25 16:29:49 +08:00
    Adia
        1
    Adia  
    OP
       2017-06-12 21:24:33 +08:00
    up
    CuminLo
        2
    CuminLo  
       2017-06-17 10:36:17 +08:00
    没看懂?结果是?
    Yoock
        3
    Yoock  
       2017-06-18 18:16:49 +08:00
    我觉得原因可能是每次 for range k 和 v 不是新建变量,而是变量复用。
    所以每次不指定输出的字符串,并发输出 v 的话,都会变成最后一次 v 的值。
    说的有点乱,希望你可以理解。
    xinQing
        4
    xinQing  
       2018-01-25 16:29:49 +08:00
    闭包问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5335 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:46 · PVG 16:46 · LAX 00:46 · JFK 03:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.