我正在学习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 ...
收到一个
收到两个
收到三个
完成!