在Gorilla websocket的示例目录中,有一个名为hub.go的文件。
https://github.com/gorilla/websocket/blob/master/examples/chat/hub.go
在这里,您可以在类型中心上找到执行此操作的方法。
func (h *hub) run() {
for {
select {
case c := <-h.register:
h.connections[c] = true
case c := <-h.unregister:
if _, ok := h.connections[c]; ok {
delete(h.connections, c)
close(c.send)
}
case m := <-h.broadcast:
for c := range h.connections {
select {
case c.send <- m:
default:
close(c.send)
delete(h.connections, c)
}
}
}
}
}
为什么在这样的最后一种情况下,它不仅仅直接发送到c.send通道?
case m := <-h.broadcast:
for c := range h.connections {
c.send <- m
}
保证无阻塞发送到通道的方法。如果c.send chan现在不能接受新消息,则将执行默认分支。如果没有select
{}块,则可以阻止发送到未缓冲或已满缓冲的通道。
我有一个YouTube频道。我想为我的网站添加新功能: 用户使用其google帐户进行身份验证。 用户创建自己的视频播客(使用此小部件),并将其上载到自己的youtube帐户。 之后,我使用YouTube API将用户视频移动到我的频道 有没有可能允许一些用户在我的频道上传他们账户的视频?也许用户可以通过Google Plus做到这一点? 附注:我看过一些文章
问题内容: 如何要求机器人将消息发送到与机器人接收命令不同的另一个通道(特定通道)? 假设bot 在channel中接收到消息,并且如果操作完成,则bot发送到channel 。 代码: 代码: 问题答案: 答案很简单:
问题内容: 由于以下代码中的某种原因,我收到“致命错误:所有goroutine都在睡眠-死锁!”。我正在使用应该不阻塞的缓冲通道。不知道我在做什么错 游乐场链接https://play.golang.org/p/J9meD5aKna 问题答案: 虽然您的解决方案可能会起作用,但我对此并不满意。 首先,您需要更改通道大小以使其起作用这一事实表明存在潜在的问题/错误。现在,每次您要启动另一个时,都必须
问题内容: 我的应用程序中有一些内存泄漏。它们都起源于一个特定的视图集群,我花了大量时间进行调整,并尝试减少尽可能多的上下文传递。这使我相信群集中使用的位图就是问题所在。因此,我考虑将WeakReferences用于所有对视图使用的位图的引用。我从未使用过WeakReference,并且不确定这是否是一个好的应用程序。任何机构都可以提供有用的指示或技巧吗? 问题答案: 因此,我考虑将WeakRef
高朗新手来了。我正在尝试围棋之旅,遇到了一个关于渠道(https://tour.golang.org/concurrency/7)的练习。这个想法是走两棵树,然后评估这些树是否相等。 我想使用select等待两个通道的结果来解决此练习。当这两个都完成时,我对结果切片进行评估。不幸的是,该方法在无限循环中进行。我添加了一些输出以查看发生了什么,并注意到只有一个通道被关闭,然后再次打开。 我显然做错了
问题内容: 据我所知,默认情况下,转到频道的行为就像一个队列,先进先出。有什么方法可以改变它们以先进先出吗? 基本上,我正在执行搜索,并且想对内存限制使用DFS而不是BFS。 问题答案: 不,这是不可能的-通道始终是FIFO。您可以使用package 。