For loop time.time#解组for循环中的binary不会连续输出相同的值

For loop time.time#解组for循环中的binary不会连续输出相同的值,for-loop,go,unmarshalling,For Loop,Go,Unmarshalling,我正在尝试构建一个计时器应用程序,它可以将target-t.Time保存在一个二进制文件中,我能够理解封送,但是反封送给了我一个小问题 我能够正确地读取每个time.time的15位块,但是当我尝试解组它们时,函数似乎每次迭代都引用相同的值。当我在循环中打印出buf时,会显示正确的位值,但当我打印出未经签名的值时,它只是第一个时间.time 谁能告诉我我做错了什么?以下是我的readFile函数的代码: func readDat() []time.Time { f, err := iou

我正在尝试构建一个计时器应用程序,它可以将target-t.Time保存在一个二进制文件中,我能够理解封送,但是反封送给了我一个小问题

我能够正确地读取每个
time.time
的15位块,但是当我尝试解组它们时,函数似乎每次迭代都引用相同的值。当我在循环中打印出
buf
时,会显示正确的位值,但当我打印出未经签名的值时,它只是第一个
时间.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
}
func readDat()[]time.time{
f、 err:=ioutil.ReadFile(“dat”)
检查(错误)
var目标[]时间.time
var buf=make([]字节,15)
时间,时间
对于i,o:=0,0;o
在下面的工作示例中,我做了一些更改。但最重要的是,您需要检查返回的错误。这个问题与偏移
o
16而不是15(每次的字节数.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
}
const timeSize=15
func readDat()[]time.time{
f、 err:=ioutil.ReadFile(“dat”)
检查(错误)
var目标[]时间.time
var buf=make([]字节,时间大小)
时间,时间
对于i:=0;i
您可以检查,看看您的数据是否有问题。也许在循环中声明
bufT
也会有帮助,谢谢你?你能告诉我具体的原因吗,为什么你声明timeSize是一个常数,而不是把15放在里面?我不太了解我的EE和信息学研究,正如我刚才读到的,它们在围棋中的表现似乎有点不同。make似乎接受任何整数类型。或者仅仅是因为它是自然的相同数量的比特需要。当我不在任何其他地方使用它时,它不仅仅是函数中声明的整数,使用var(本例中为const)的任何原因都是为了消除出现的多次
15
(减少类型的可能性)。为什么要使用常量?所以你不能意外地改变它,因为它是常数。在Go中,非类型化数值常量的默认类型是有符号整数,这就是
15