go.net/websocket
包具有Read()
和Write()
功能,用于通过web套接字发送和接收消息。为什么它不返回一个发送和接收消息的通道?我觉得像websocket
、net
这样的软件包是使用go频道的完美场所。这个设计决策背后的原因是什么?
我不知道WebSockets的确切语义,但总的来说,我认为网络套接字不能很好地映射到通道中。实际上,有一个netchan软件包试图在一般渠道中做到这一点,但它已经停止了。
我认为在尝试和支持一个通道实现的大量协议时存在许多问题。消息从哪里开始和结束?通道应该缓冲一个大消息,还是一块一块地给它,等等。?每个协议的语义差异太大,所以Go为您提供了套接字的较低级别的读/写,就像您在其他语言中找到的一样,并让您决定如何处理数据。
请注意,我谈论的是套接字通道。WebSocket是一个定义良好的协议,使用通道的实现可能对它很有效。至于为什么没有选择通道,最好询问go.net/websocket
的作者(试试golang-nuts
谷歌小组)。我认为这在某种程度上是有意义的,因为它现在的API类似于常规的Go套接字API。
请注意,不使用通道不会使API成为非电流。只要连接是在单独的goroutine上处理的(Go的HTTP服务器就是这样),它们就会同时处理。在这里,使用或不使用频道只是一个方便的问题。