time.Time#UnmarshalBinary不会连续输出相同的值

问题描述 投票:0回答:1

我正在尝试构建一个计时器应用程序,以实现持久性,将目标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
}
for-loop go unmarshalling
1个回答
0
投票

我在下面的工作示例中做了几处更改。但最重要的是,您需要检查返回的错误。该问题专门与将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
}
© www.soinside.com 2019 - 2024. All rights reserved.