Golang Go语言中自定义协议发送数据,append []byte 居然被截断。

发布于 1周前 作者 bupafengyu 来自 Go语言

append []byte 居然被截断。求指导。。调不出来了。

func (msg *Msg)PackMsg() []byte{
    buf:=make([]byte,0)
    buf = append(buf,msg.Proto...)
    buf = append(buf,util.Uint32ToBytes(msg.ProtoLen)...)
    buf = append(buf,msg.ProtoData...)
    //buf = append(buf,msg.FileData...)
    buf = append(buf,util.Uint32ToBytes(msg.FileLen)...)
    //被截断了。不知道为什么
    //这里 msg.FileData 长度明明是 1024
    buf = append(buf,msg.FileData...)
    //这里最后的 buflen 是被截断过的,也就是说 buf = append(buf,msg.FileData...)只有一部分数据 append 进去了
    return buf
}

Golang Go语言中自定义协议发送数据,append []byte 居然被截断。

更多关于Golang Go语言中自定义协议发送数据,append []byte 居然被截断。的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

len(msg.FileData)看看是不是 msg.FileData 被截断了

更多关于Golang Go语言中自定义协议发送数据,append []byte 居然被截断。的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我勒个去,别这么 append,内存累死了

没事的,不是每次都拷贝

用内存 buff 也比这个强啊

bytes.Buffer

bytes encoding/binary 善用基础库啊

这个是,有现成、好用的轮子,再自己造就没啥意思了


我自己试了下好像 append 对比 Buffer 似乎没有很大的性能差距
BenchmarkPack-4 500000 3051 ns/op
BenchmarkPackBuffer-4 500000 2992 ns/op
我只是简单地用 Buffer.Write 替换了 append,请问是不是漏了什么

性能本身区别肯定不大,都是那点东西,该怎么分配内存就怎么分配,主要的区别其实一个是书写上更方便,再有 Buffer 是 io 接口的,可以用在所有需要 io 的地方。但我在项目里的要求是用 Buffer,主要是 append 容易写错,每次都要带上"…"这种很容易忘记,算是内部代码规范的强制要求吧。

没截断。。是 1024.但是 append 之后整个 slice 长度并不会变长。。被截断了。

我写了一段测试代码,但是没发现截断的情况啊。slice 的长度在 append 的时候会自动增长.
func main() {
buf := make([]byte, 0)

buf = append(buf, “1234567890”…)
buf = append(buf, “1234567890”…)
buf = append(buf, “1234567890”…)
buf = append(buf, “1234567890”…)
buf = append(buf, “1234567890”…)

text := “”
for i := 0; i < 1024; i++ {
text += “x”
}
buf = append(buf, text…)

fmt.Println(len(buf))
fmt.Println(string(buf))
}

这段代码运行后,buf 长度为 1074.

我自己测也是你这样的,,但是那个代码就是会被截断。。

线上和测试环境 go 版本是否一致, 把代码提出来单独运行看看, 调试单步跟踪一下, 看是否正常, 可能不是这边的问题.

在Go语言中,如果你在使用append函数向[]byte切片追加数据时遇到了数据被截断的问题,这通常不是append函数本身的bug,而是可能由以下几个原因导致的:

  1. 切片容量不足append函数在必要时会自动分配更大的底层数组来存储新数据,但如果你是在一个循环中大量追加数据,且每次追加的数据量较大,可能会导致内存分配频繁或达到内存限制。请检查你的内存使用情况和切片增长模式。

  2. 切片被意外修改:如果在追加数据的过程中,切片被其他goroutine修改(如并发写入),可能会导致数据不一致或截断。确保对切片的访问是线程安全的。

  3. 逻辑错误:检查你的代码逻辑,确保在追加数据前没有误操作切片(如错误地设置了切片的长度或容量)。

  4. 缓冲区溢出:如果你是在网络编程中发送数据,确保发送缓冲区足够大以容纳所有数据。同时,检查网络层的配置和错误处理逻辑。

为了解决这个问题,你可以尝试以下步骤:

  • 确保在循环追加数据时,每次追加后检查切片的长度和容量。
  • 使用同步机制(如互斥锁)来保护对切片的并发访问。
  • 增加日志输出,帮助定位数据被截断的具体位置。
  • 如果问题依然存在,考虑使用更专业的调试工具或内存分析工具来检查程序的运行状态。
回到顶部