go - 了解 Golang 中的频道
问题描述
我有一个简单的代码,它接收一个对象并将其广播到所有连接的客户端,但是当我尝试写入它并且执行 <- 对通道没有任何作用时,通道会阻塞。这是相关代码:
package Server
import (
"bytes"
"encoding/gob"
"log"
"net"
)
import "fmt"
type defaultMethod = func () (interface{}, error)
type CoreServer struct {
methods map[string]defaultMethod
translation []string
event chan Event
method map[net.Conn]chan defaultMethod
stop chan bool
}
type Event struct {
Description string
}
func (cs *CoreServer) RaiseEvent(raisedEvent Event) {
fmt.Println("Before")
cs.event <- raisedEvent
fmt.Println("After")
}
func (cs *CoreServer) eventTrigger(socket net.Conn) {
for true {
fmt.Println("Waiting...")
event := <- cs.event
fmt.Println("Done Waiting")
var data []byte
data = append(data, 0x2)
data = append(data, []byte(event.Description)...)
socket.Write(data)
}
}
func (cs *CoreServer) client(socket net.Conn) {
cs.method[socket] = make(chan defaultMethod)
cs.handshake(socket)
// start receive thread
go cs.inboundTraffic(socket)
// start send threads
go cs.methodInvocation(socket)
go cs.eventTrigger(socket)
<- cs.stop
fmt.Println("EXITING")
}
这里唯一的输出是Before
,然后当客户端加入时(客户端函数在 goroutine 中执行)输出是Waiting...
并且事件 goroutine 停止,是否有一些我没有看到或理解的明显问题?
解决方案
推荐阅读
- python - 在 Django 中自动返回“无”的 ID 字段
- python - LSTM 混淆中的时间步长
- python - 在 pandas DataFrame 中计算平均值时,如何过滤掉使用 <5 个值来计算平均值的行?
- javascript - 即使从 api 推送值,我的数组也返回空
- ffmpeg - 当我尝试使用网络摄像头的原始流时,为什么 ffmpeg 会挂起?
- react-native - 导入“@highcharts/highcharts-react-native”的问题 - 模块解析失败:意外的令牌
- php - 根据深度嵌套数组PHP的值过滤多维数组
- javascript - Socket.io:从两个房间配对而不重复配对?
- javascript - 使用 MomentJS 获取从现在到下一个固定时间之间的毫秒数
- reactjs - 如何使用 Formik 更改一组复选框的 UI 状态