英文:
Why does not go.net/websocket'api use channels for sending and receiving messages?
问题
go.net/websocket
包中有Read()
和Write()
函数,用于通过Web套接字发送和接收消息。为什么它不返回一个用于发送和接收消息的通道呢?我觉得像websocket
、net
这样的包是使用Go语言通道的理想场所。这个设计决策背后的原因是什么?
英文:
go.net/websocket
package has Read()
and Write()
functions for sending and receiving messages through the web socket. Why does not it instead return a channel for sending and receiving messages? I feel like packages such as websocket
, net
are perfect places to use go's channels. What is the reasoning behind this design decision?
答案1
得分: 2
我不知道WebSockets的确切语义,但一般来说,我认为网络套接字不太适合映射到通道。实际上,曾经有一个叫做netchan的包试图使用通道来实现这个功能,但后来被停用了。
我认为使用一个通道实现来支持大量协议会有很多问题。消息从哪里开始,到哪里结束?通道应该缓冲大型消息,还是逐块传输?每个协议的语义差异太大,所以Go语言为套接字提供了更底层的读写操作,就像其他语言中的套接字一样,让你自己决定如何处理数据。
需要注意的是,我在谈论通常的套接字通道。WebSocket是一个定义明确的协议,使用通道的实现可能很适合它。至于为什么没有选择通道,最好向go.net/websocket
的作者询问(可以尝试golang-nuts
谷歌群组)。我认为从某种意义上讲,这是有道理的,因为现在的API与常规的Go套接字API相似。
需要注意的是,不使用通道并不意味着API不支持并发。只要连接在单独的goroutine中处理(在Go的HTTP服务器中是这样的),它们就会被并发处理。在这里,使用通道与否只是一种方便的方式。
英文:
I don't know the exact semantics of WebSockets, but in general, I don't think network sockets map well into channels. There was actually a netchan package that tried to did this with channels in general, but it was discontinued.
I think there many problems to try and support a whole lot of protocols with one channel implementation. Where does the message begin and end? Should the channel buffer a large message, or give it chunk by chunk, etc.? The semantics of each protocol differ too much, so Go gives you the lower-level Read/Write for sockets, just like you'd find in other languages and leaves it for you to decide how to handle the data.
Note that I'm talking about socket-channels in general. WebSocket is a well-defined protocol and an implementation using channels might work well for it. As for why channels weren't chosen, it would be best to ask the authors of go.net/websocket
(try golang-nuts
Google group). I think it makes sense in a way, as its API as it is now is similar to the regular Go socket API.
Note that not using channels does not make the API non-concurrent. As long as connections are being handled on separate goroutines (which they are, with Go's HTTP server), they'll be handled concurrently. Using a channel or not is just a matter of convenience here.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论