[希望释放数量不定的goroutine。在此示例中,添加到number
通道。然后在滚动时从messages
通道中读取消息。
为什么我希望在此代码中看到全部100条消息,为什么只看到一条消息?如何查看所有已添加号码的消息?
package main
import (
"fmt"
)
func Run(numbers chan int, messages chan string) {
stuff := <-numbers
messages <- fmt.Sprintf("Ran %d", stuff)
}
func main() {
var numbers = make(chan int)
var messages = make(chan string)
go Run(numbers, messages)
for i := 0; i < 100; i++ {
go func(i int) { numbers <-i }(i)
}
msg := <-messages
fmt.Println(msg)
}
将消息置于范围内会导致死锁。
package main
import (
"fmt"
)
func Run(numbers chan int, messages chan string) {
stuff := <-numbers
messages <- fmt.Sprintf("Ran %d", stuff)
}
func main() {
var numbers = make(chan int)
var messages = make(chan string)
go Run(numbers, messages)
for i := 0; i < 100; i++ {
go func(i int) { numbers <-i }(i)
}
for msg := range messages {
fmt.Println(msg)
}
}
因为Run
从numbers
读取一条消息,将一条消息写入messages
,然后终止。请尝试以下方法:
func Run(numbers chan int, messages chan string) {
for stuff := range numbers {
messages <- fmt.Sprintf("Ran %d", stuff)
}
}
将一直运行到numbers
关闭。