socket如何节省内存? net conn.Read() 必须规定切片长度.!!!!!!!

conn.Read($slice) 读取信息时,必须规定$slice的长度, 信息可能是1字节-2KB长度, 难道创建$slice = make([]byte,2048)? 这也太浪费内存了吧? 请问该如何解决呢?

用io/ ioutil.ReadAll(io.Reader) 则一直读取直到遇到EOF或者错误, 无法读取一段数据;
当然还有其他包, 如读取单个字符, 读取到分隔符等等, 感觉效率太差.
还有bufio.NewReader(conn) 其本质就是 make([]byte,4KB)完全是多此一举.

请问, TCP交互, 大家都怎么读取的? make([]byte,2048) 这个方案明显有问题, 内存开销大.

共 2 个回复


heimeil

选一个合适的大小make一次重复用就行了,又不用每次读都make一个,也就是分配一个固定大小的缓冲区。

conn.Read()会返回读取的长度,根据长度取出来数据交给其他处理逻辑,这个缓冲区又可以再继续用了。

# 0

scroot

首先解决思路是不对的,这样做只会越做越麻烦

Read是 io.Reader 的接口方法

读取数据时,我们要使用数据流的概念
datastream

所谓的网络接收数据,就是从网络端数据流向你的目的地

# 1