为什么go.net/websocket'api不使用频道发送和接收消息?

时间:2013-08-30 08:36:05

标签: concurrency websocket go

go.net/websocket包具有Read()Write()功能,用于通过Web套接字发送和接收消息。为什么不返回发送和接收消息的频道?我觉得像websocketnet这样的软件包是使用go频道的最佳选择。这个设计决定背后的原因是什么?

1 个答案:

答案 0 :(得分:2)

我不知道WebSockets的确切语义,但总的来说,我认为网络套接字不能很好地映射到通道中。 There was actually a netchan package试图通过渠道进行此操作,但已停止使用。

我认为尝试使用一个通道实现支持大量协议存在许多问题。消息的开始和结束位置在哪里?通道应该缓冲一个大的消息,还是通过块等给它块?每个协议的语义差异太大,因此Go为您提供了较低级别的读/写套接字,就像您在其他语言中找到的一样,并让您决定如何处理数据。

请注意,我一般都在讨论套接字通道。 WebSocket是一个定义明确的协议,使用通道的实现可以很好地适用它。至于为什么没有选择频道,最好问问go.net/websocket的作者(试试golang-nuts Google小组)。我认为它在某种程度上是有道理的,因为它现在的API类似于常规的Go套接字API。

请注意,不使用通道不会使API非并发。只要连接在不同的goroutine(使用Go的HTTP服务器)处理,它们就会被同时处理。是否使用频道只是为了方便。