我正在学习Go,我想尝试goroutines和频道。
这是我的代码:
package main
import "fmt"
func main(){
messages := make(chan string,3)
messages <- "one"
messages <- "two"
messages <- "three"
go func(m *chan string) {
fmt.Println("Entering the goroutine...")
for {
fmt.Println(<- *m)
}
}(&messages)
fmt.Println("Done!")
}
结果如下:
Done!
我不明白为什么我的goroutine永远不会被执行。 &#34;进入goroutine&#34;没有打印,我没有任何错误信息。
答案 0 :(得分:21)
事实是你的goroutine开始了,但是在做任何事情之前就结束了因为你的程序在打印后立即停止Done!
:goroutines的执行独立于主程序,但是会在程序停止时执行。所以基本上,你需要一些程序让程序等待它们。它可能是另一个等待许多消息的频道,sync.WaitGroup
或其他技巧。
你应该阅读golang博客中的优秀post about concurrency in go。
答案 1 :(得分:6)
您的Goroutine没有足够的时间执行,因为主要功能在打印Done!
后退出。
你需要做一些事情让程序等待Goroutine。
最简单的方法是在最后添加time.Sleep()
。
package main
import (
"fmt"
"time"
)
func main() {
messages := make(chan string, 3)
messages <- "one"
messages <- "two"
messages <- "three"
go func(m *chan string) {
fmt.Println("Entering the goroutine...")
for {
fmt.Println(<-*m)
}
}(&messages)
time.Sleep(5 * time.Second)
fmt.Println("Done!")
}
输入goroutine ...
一个
2个
3个
完成!
虽然这有效,但除了goroutines之外,建议使用sync
包中的通道或函数来同步并发代码。
示例:
package main
import (
"fmt"
)
func main() {
messages := make(chan string, 3)
go func(m chan string) {
defer close(m)
fmt.Println("Entering the goroutine...")
messages <- "one"
messages <- "two"
messages <- "three"
}(messages)
for message := range messages {
fmt.Println("received", message)
}
fmt.Println("Done!")
}
输入goroutine ...
收到一个 收到两个
收到三个 完成!