Невозможно получить значение из карты [time.Time] Измерьте в Golang с помощью if val, ok: = mapMeasures [ts]; Хорошо {} - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть карта, которая определяется как:

mapMeasures := make(map[time.Time]models.Measure, 0)

с

type Measure struct {
    Delta         float64      // I just let one field to simplificate
}

Таким образом, начальная l oop будет заполнять значения от 22/01/20-10:10:00 до 22/01/20-12:00:00, поэтому он будет хранить значение 12 ключей (10-минутный шаг)

Затем он снова будет l oop этих временных меток и добавит дельту к существующему значению.

Итак, мне нужно проверить, ключ, соответствующий моей фактической отметке времени, уже существует:

if val, ok := mapMeasures[ts]; ok { // ts already exists, we must sum delta values
    measure.Delta += val.Delta
}

Но, похоже, это условие никогда не выполняется.

Я отладил код и вижу, что отметка времени действительно присутствует внутри map:

 mapMeasures = {map[time.Time]gitlab.com/company/common/models.Measure} 
 0 =  -> 
  key = {time.Time} 2020-01-22 11:40:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc000132460} 
 1 =  -> 
  key = {time.Time} 2020-01-22 12:30:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc000132780} 
 2 =  -> 
  key = {time.Time} 2020-01-22 12:50:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc0001328c0} 
 3 =  -> 
  key = {time.Time} 2020-01-22 11:00:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc000132140} 
 4 =  -> 
  key = {time.Time} 2020-01-22 11:10:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc000132280} 
 5 =  -> 
  key = {time.Time} 2020-01-22 11:20:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc000132320} 
 6 =  -> 
  key = {time.Time} 2020-01-22 11:30:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc0001323c0} 
 7 =  -> 
  key = {time.Time} 2020-01-22 11:50:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc000132500} 
 8 =  -> 
  key = {time.Time} 2020-01-22 12:00:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc0001325a0} 
 9 =  -> 
  key = {time.Time} 2020-01-22 12:10:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc000132640} 
 10 =  -> 
  key = {time.Time} 2020-01-22 12:20:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc0001326e0} 
 11 =  -> 
  key = {time.Time} 2020-01-22 12:40:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc000132820} 

Actual ts:

{time.Time} 2020-01-22 11:00:00 +0100

Есть ли какие-либо проблемы с ключом, который будет меткой времени? Должен ли я преобразовать его в строку, или Int ???

1 Ответ

5 голосов
/ 02 апреля 2020

Цитирование из time.Time:

Обратите внимание, что оператор Go == сравнивает не только момент времени, но также местоположение и однотонные c часы. чтение. Следовательно, значения времени не должны использоваться в качестве ключей карты или базы данных без предварительной гарантии того, что для всех значений установлено одинаковое местоположение, что может быть достигнуто с помощью метода UT C или локального, и что монотонность c чтение часов было убрано путем установки t = t.Round (0). В общем, предпочитайте t.Equal (u) вместо t == u, поскольку t.Equal использует наиболее точное и доступное сравнение обрабатывает случай, когда только один из его аргументов имеет монотонное c чтение часов.

Не используйте time.Time в качестве ключей карты, вместо этого используйте метку времени Unix, возвращаемую Time.Unix(). Unix отметка времени - это местоположение и монотонное c показание часов «свободно».

Если ваши ключи должны также включать местоположение (часовой пояс), то используйте структуру, которая включает отметку времени Unix и смещение зоны, например:

type Key {
    ts     int64
    offset int
}

См. связанный вопрос: Почему 2 временные структуры с одинаковой датой и временем возвращают ложное значение по сравнению с ==?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...