我正在尝试构建一个计时器应用程序,以实现持久性,将目标t.Time保存在二进制文件中,我能够弄清楚封送处理,但拆封处理给我带来了一个小问题
我能够正确读取每个time.Time
的15位块,但是当我尝试将它们解组时,该函数似乎在每次迭代中都引用相同的值。当我在循环中打印出buf
时,会出现正确的位值,但是当我打印出未编组的值时,它只是第一个time.Time
。
有人可以提示我我做错了什么吗?这是我的readFile
函数的代码:
func readDat() []time.Time {
f, err := ioutil.ReadFile("dat")
check(err)
var targets []time.Time
var buf = make([]byte, 15)
var bufT time.Time
for i, o := 0, 0; o < len(f); i++ {
buf = f[o : o+15]
bufT.UnmarshalBinary(buf) // pointer? bits in buf sind korrekt
targets = append(targets, bufT)
o = o + 16
}
return targets
}
我在下面的工作示例中做了几处更改。但最重要的是,您需要检查返回的错误。该问题专门与将o
偏移16而不是15(每次time.Time的字节数)有关。
您在每次迭代中看到相同时间的原因是,因为您仅在第一次解组中成功,然后您被1折断,然后被2折断,依此类推,因此,直到您再次进行正确的解组连续有15次由于bufT
不会在第一次迭代后更新,并且您不检查错误代码,因此会重复添加相同的代码。
const timeSize = 15
func readDat() []time.Time {
f, err := ioutil.ReadFile("dat")
check(err)
var targets []time.Time
var buf = make([]byte, timeSize)
var bufT time.Time
for i := 0; i < len(f); i += timeSize {
copy(buf, f[i:i+timeSize])
err := bufT.UnmarshalBinary(buf)
check(err)
targets = append(targets, bufT)
}
return targets
}