为什么我的goroutine没有执行?

时间:2014-06-26 08:38:14

标签: go

我正在学习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;没有打印,我没有任何错误信息。

2 个答案:

答案 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个
  完成!

Playground

虽然这有效,但除了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 ...
  收到一个   收到两个
  收到三个   完成!

Playground