go.net/websocket
包具有Read()
和Write()
功能,用于通过Web套接字发送和接收消息。为什么不返回发送和接收消息的频道?我觉得像websocket
,net
这样的软件包是使用go频道的最佳选择。这个设计决定背后的原因是什么?
答案 0 :(得分:2)
我不知道WebSockets的确切语义,但总的来说,我认为网络套接字不能很好地映射到通道中。 There was actually a netchan package试图通过渠道进行此操作,但已停止使用。
我认为尝试使用一个通道实现支持大量协议存在许多问题。消息的开始和结束位置在哪里?通道应该缓冲一个大的消息,还是通过块等给它块?每个协议的语义差异太大,因此Go为您提供了较低级别的读/写套接字,就像您在其他语言中找到的一样,并让您决定如何处理数据。
请注意,我一般都在讨论套接字通道。 WebSocket是一个定义明确的协议,使用通道的实现可以很好地适用它。至于为什么没有选择频道,最好问问go.net/websocket
的作者(试试golang-nuts
Google小组)。我认为它在某种程度上是有道理的,因为它现在的API类似于常规的Go套接字API。
请注意,不使用通道不会使API非并发。只要连接在不同的goroutine(使用Go的HTTP服务器)处理,它们就会被同时处理。是否使用频道只是为了方便。