我正试图为os.File
或更具体的io.Reader
创建一个mock。我想模拟在没有实际读取的情况下读取128位具体数据。
使用单个uint32
不会出现任何问题。
实物模型:
func (f *FileMock) Read(buf []byte) (n int, err error) {
binary.BigEndian.PutUint32(buf, uint32(2052))
return len(buf), nil
}
测试方法(简化):
b := make([]byte, 128)
meta_data := make([]uint32, 4)
_, err = s.Read(b)
if err != nil {
// Handle error
}
binary.Read(bytes.NewBuffer(b), binary.BigEndian, &meta_data)
log.Print(meta_data) // Output [2052 0 0 0]
但是,当我需要模拟读取uint32
切片时,PutUint32
没有帮助,因为它从一开始就写入切片(覆盖以前写入的数据)。我尝试了bytes
和binary
工具的组合,但每次都没能从字节中取回数据。这是我最后一次尝试(不是唯一一次):
func (f *FileMock) Read(b []byte) (n int, err error) {
buf := bytes.NewBuffer(make([]byte, len(b)))
err = binary.Write(buf, binary.BigEndian, [4]uint32{2051, 123, 28, 28})
buf.Read(b)
return len(b), nil
}
使用与上述相同的测试方法,我获得了一个空切片[0, 0, 0, 0]
请注意,这是os.File.Read
方法的mock,因此我无法创建新的字节切片,而需要将数据写入现有切片
起初我想知道如何解决这个问题。我也想知道为什么只有[0, 0, 0, 0]
?
感谢你的回答!
Slices共享底层数组,可以将(PutUint32)写入buf[4:]、buf[8:]等。