time.Time # UnmarshalBinary в for-l oop выводит одно и то же значение непрерывно - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь создать приложение таймера, которое для сохранения сохраняет target-t.Time в двоичном файле, я смог разобрать маршалинг, но немаршалинг доставляет мне небольшую проблему

I ' Я могу правильно прочитать 15-битные чанки для каждого time.Time, но когда я пытаюсь разобрать их, функция, похоже, ссылается на одно и то же значение в каждой итерации. Когда я печатаю buf в l oop, появляются правильные битовые значения, но когда я распечатываю немаршированные значения, это только первые 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
}

1 Ответ

1 голос
/ 08 марта 2020

Пара вещей, которые я изменил ниже в рабочем примере. Но самое главное, вам нужно проверить ваши возвращенные ошибки. Проблема была связана именно со смещением o на 16 вместо 15 (количество байтов за раз. Время).

Причина, по которой вы видите одно и то же время на каждой итерации, заключается в том, что вы добились успеха только в в первый раз, затем отключите на 1, затем на 2, et c, et c, поэтому время не будет корректно отменено до тех пор, пока вы не выполните 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...