我正在学习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!")
}
Run Code Online (Sandbox Code Playgroud)
这是结果:
Done!
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我的goroutine永远不会被执行.没有打印"输入goroutine",我没有任何错误消息.
您的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!")
}
Run Code Online (Sandbox Code Playgroud)
进入够程...
一个
2
3
完成!
虽然这有效,但sync除了goroutines之外,还建议使用包中的通道或函数来同步并发代码.
例:
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!")
}
Run Code Online (Sandbox Code Playgroud)
进入goroutine ...
收到一个
收到两个
收到三个
完成!