go - 无法在 go 例程中获取多个通道值
问题描述
我已经编写了 2 个用于 Web 套接字读取和写入消息的 goroutine。例如,
ch := make(chan bool)
folderName := make(chan string)
go func(co *websocket.Conn) {
m, d, err := co.ReadMessage()
fmt.Println(m, string(d), err)
folderName <- string(d)
ch <- true
if string(d) == "closed" {
ch <- true
co.Close()
}
}(conn)
该 goroutine 用于从套接字读取消息并更新通道。
go func(co *websocket.Conn) {
value := <-ch
fldr := <-folderName
fmt.Println(fldr, value)
}(conn)
这个 goroutine 用于编写消息。但我无法获得 folderName 和 ch 频道值。我不知道如何找到问题。
如果我通过单通道,我可以从通道中获取消息。但我需要在那个 goroutine 中获得 2 个值。
任何人都可以帮助解决这些问题吗?提前致谢。
解决方案
在您的情况下,由于您从那里读取单个消息,因此websocket.Connection
您需要更改从通道读取的顺序,因为您的通道没有缓冲,只要没有消费者,您的写入就会被阻止,反之亦然。在您的情况下,您在第一个 goroutine 中写入folderName
通道,然后从另一个通道读取,ch
因此您的两个 goroutine 都将被阻塞。
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan bool)
folderName := make(chan string)
go func() {
ch <- true
folderName <- "Some text"
.
.
.
}()
go func() {
value := <-ch
fldr := <-folderName
fmt.Println(fldr, value)
}()
time.Sleep(time.Second)
}
推荐阅读
- java - 删除 XML 标记但不删除数据
- django - Django - 在模板中验证搜索查询
- sql - 日期与今天的日期比较
- python - 如何将 django 项目之外的函数或类导入到它?
- rust - 用连续整数初始化数组
- r - 以编程方式在构面中设置单个轴限制
- python - Python计算元组列表中元组的共现
- selenium-webdriver - 我收到编译错误为“类型不匹配:无法从 FirefoxDriver 转换为 WebDriver”
- python - 当我运行获取请求时,我不断收到 AttributeError: 'set' object has no attribute 'items'?
- css - 网格区域之间的间距