从[] byte读取uint8而不创建byte.Buffer

时间:2019-06-18 22:18:20

标签: go buffer

如何在不创建unit8的情况下从[]byte读取bytes.Buffer。像这样将值写入缓冲区,

buf := new(bytes.Buffer)
binary.Write(buf, binary.BigEndian, uint32(1))
binary.Write(buf, binary.BigEndian, uint8(1))
b := buf.Bytes()

在解码的同时,也可以轻松完成uint32的操作,如下所示...

len := binary.BigEndian.Uint32(b[:4])

但是对于uint8来说,检索我能想到的值的唯一方法是创建一个缓冲区,然后读取第一个字节,

buf := new(bytes.Buffer)
_, err := buf.Write(b[4:5])
// error handling ...
id = buf.ReadByte()

似乎encoding/binary pkg中没有用于uint8值检索的方法。而且我猜想背后可能有一些很好的理由。

问题:是否有其他方法可以从该uint8读取[]byte,而无需创建Buffer

2 个答案:

答案 0 :(得分:4)

使用index expression从切片中获取单个uint8

len := binary.BigEndian.Uint32(b[:4])
id := b[4]  // <-- index expression

请注意,byteuint8的{​​{3}}。

答案 1 :(得分:-1)

这是我发现的一种优雅方式,

var len uint32
var id uint8
binary.Read(buf, binary.BigEndian, &len)
binary.Read(buf, binary.BigEndian, &id)

// this method doesn't need you to create a buffer for each value read