gpt4 book ai didi

go - byte[] channel 使用

转载 作者:IT王子 更新时间:2023-10-29 01:35:43 27 4
gpt4 key购买 nike

我收到一个 REST 命令,想计算它的哈希函数。为此,我使用 io.TeeReader(request.Body, &writerToHash) 读取正文,我在其中传递了我自己的实现 io.Writer 的类:

func (self *WriterToHash) Write(p []byte) (n int, err error) {
n=len(p)
fmt.println("WriterToHash len=%v, buff=%v", n, p) //PRINT 1
self.BodyChannel <- p
return n, nil
}

BodyChannel 定义为:BodyChannel chan []byte

我按如下方式使用这个类:

    writerToHash := sisutils.WriterToHash{
BodyChannel:make(chan []byte, 1024)
}
writerToHash.StartListen()
reqnew, _ := http.NewRequest("PUT", url, io.TeeReader(request.Body, &writerToHash))

听力部分:

func (wth *WriterToHash) StartListen() {
wth.OutChannel = make(chan []byte, 1000)
go func (self *WriterToHash) {
done := int64(0)
h := sha1.New()
for done < MessageSize{
buff := <- self.BodyChannel

done += int64(len(buff))
DPrint(5, "AccamulateSha1 Done=: %v, buff=%v", done, buff) //PRINT 2

actually_write, err := h.Write(buff)
if err != nil || actually_write != len(buff) {
log.Println("Error in sha write:" + err.Error())
break
}
}
bs := h.Sum(nil)
self.OutChannel <- bs
}(wth)
}

我发送 1000 字节的消息。在 Debug模式下,消息总是以相同的方式拆分:1 个字节,999 个字节——我使用 PRINT 1 看到它。在这种情况下,everythong 工作正常。问题在于,当消息在 Write 函数中被拆分为更多部分时。在这种情况下,我在 PRINT1 中看到:

[第一个字节] : a

[下一个 ~450 字节] : b,c,d,...

[last ~550 bytes] : w,x,y,...

但在 PRINT 2 中我看到了不同的图片:

[第一个字节] : a

[ ~450 字节但从最后一部分开始] : w,x,y...

[last ~550 bytes] : w,x,y,...

实际上我得到了两次过去,但大小不同。

最佳答案

来自io.Writer documentation :

Write must not modify the slice data, even temporarily. Implementations must not retain p

您不能存储或重复使用传递给 Write 方法的 slice 。如果你想在别处使用这些数据,你需要复制它

func (self *WriterToHash) Write(p []byte) (n int, err error) {
b := make([]byte, len(p))
copy(b, p)
fmt.println("WriterToHash len=%d, buff=%v", len(p), b)
self.BodyChannel <- b
return len(p), nil
}

关于go - byte[] channel 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41250130/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com