我在学围棋,我想try 一下围棋套路和频道.

这是我的代码:

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从未被处决."进入goroutine"没有打印出来,我没有任何错误消息.

推荐答案

事实是,您的goroutine启动,但在执行任何操作之前结束,因为您的程序在打印Done!之后立即停止:goroutine的执行独立于主程序,但将在与程序相同的位置停止.所以基本上,你需要一些过程来让程序等待他们.它可以是等待大量消息、sync.WaitGroup或其他技巧的另一个频道.

你应该读一下golang博客上的优秀post about concurrency in go.

Go相关问答推荐

如果添加构建标签,gopls将停止工作

如何使用中间件更改http请求的响应代码?

";无效的复制因子;融合Kafka Go客户端

testcontainers:如何修复绑定源路径不存在

如何将字节文件高效地读入int64切片?

这是泛型的有效用例吗?

为什么docall在singleflight中使用go panic?

使用 Go Colly 抓取所有可能的标签并将它们放入一个变量中

使用 LINQ 对内部数组进行排序

Golang crypto/rand 线程安全吗?

Go 中的 HTTP 请求验证中间件

从 os.stdout 读取

如何将具有嵌入式 struct 的 struct 展平为 json

Golang Getrlimit 返回与 ulimit 不同的值

为什么时间很短.睡眠时间比基准测试中要求的(约 300 ns)长?

自定义指标未显示在 prometheus web ui 中,grafana 中也是如此

不理解切片和指针

try 执行`go test ./... -v`时,Golang中有没有办法设置标志

如何使用 context.WithCancel 启动和停止每个会话的心跳?

如何迭代在泛型函数中传递的片的并集?