Диапазон по срезу и указателю - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть следующий диапазон для фрагмента определенной структуры:

var t1, t2 *time.Time
for _, d := range entries {
    if d.EntryType == print {
        t1 = &d.LogTime
    }
    if d.EntryType == saw {
        t2 = &d.LogTime
    }
}

В моем примере в моей структуре есть два объекта, и я знаю, что они разные. Но когда я печатаю оба указателя времени с помощью String или когда я делаю некоторые вычисления, я вижу, что оба имеют одинаковое значение второго.

Когда я меняю назначение на

tmp := d.LogTime
t1 = &tmp

Я могу сделать свои вычисления, потому что оба указателя указывают на разные объекты.

1 Ответ

0 голосов
/ 26 апреля 2018

Приложение получает адрес переменной d, а не адрес элемента слайса. Переменная d находится вне цикла и имеет одинаковый адрес на каждой итерации цикла.

код

tmp := d.LogTime
t1 = &tmp

работает, потому что tmp находится внутри цикла.

Возможно, вы намеревались взять адрес элемента слайса. Если это так, используйте этот код:

for i:= range entries {
    if d.EntryType == print {
        t1 = &entries[i].LogTime
    }
    if d.EntryType == saw {
        t2 = &entries[i].LogTime
    }
}

Здесь может быть причина использовать значения *time.Time, но обычно приложения работают с time.Time. Этот код может делать то, что вам нужно:

var t1, t2 time.Time
for _, d := range entries {
    if d.EntryType == print {
        t1 = d.LogTime
    }
    if d.EntryType == saw {
        t2 = d.LogTime
    }
}
...