【发布时间】:2014-11-07 16:25:30
【问题描述】:
对不起,如果这是一个新手问题,但我是新手 ;)。我有following playground。如何动态创建我的 goroutine?我在操场上的第一组按预期工作,但我的第二组为每个值返回“11”。我可以通过取消注释第 38 行来解决它,但这似乎有点像 hack。有没有更喜欢的方式来动态创建我的 goroutine?
package main
import (
"fmt"
"log"
"time"
)
func myFunc(i int) int {
return i
}
func first() {
firstChannel := make(chan int)
go func() { firstChannel <- myFunc(0) }()
go func() { firstChannel <- myFunc(1) }()
go func() { firstChannel <- myFunc(2) }()
go func() { firstChannel <- myFunc(3) }()
go func() { firstChannel <- myFunc(4) }()
go func() { firstChannel <- myFunc(5) }()
go func() { firstChannel <- myFunc(6) }()
go func() { firstChannel <- myFunc(7) }()
go func() { firstChannel <- myFunc(8) }()
go func() { firstChannel <- myFunc(9) }()
go func() { firstChannel <- myFunc(10) }()
for k := 0; k < 11; k++ {
select {
case result := <-firstChannel:
log.Println(result)
}
}
}
func second() {
secondChannel := make(chan int)
for j := 0; j < 11; j++ {
go func() { secondChannel <- myFunc(j) }()
//time.Sleep(1*time.Millisecond)
}
for k := 0; k < 11; k++ {
select {
case result := <-secondChannel:
log.Println(result)
}
}
}
func main() {
fmt.Println("First set------------------")
first()
time.Sleep(1 * time.Second)
fmt.Println("Second set------------------")
second()
}
结果:
First set------------------
2009/11/10 23:00:00 0
2009/11/10 23:00:00 1
2009/11/10 23:00:00 2
2009/11/10 23:00:00 3
2009/11/10 23:00:00 4
2009/11/10 23:00:00 5
2009/11/10 23:00:00 6
2009/11/10 23:00:00 7
2009/11/10 23:00:00 8
2009/11/10 23:00:00 9
2009/11/10 23:00:00 10
Second set------------------
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
2009/11/10 23:00:01 11
【问题讨论】:
标签: go