Быстрая карта Указатель Равенство в Go - PullRequest
0 голосов
/ 14 марта 2020

У меня есть горячий кодовый путь (100 тыс. Запусков), который необязательно должен заполнить карту некоторыми значениями.

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

mystruct struct {
   mymap
}

for i range 10000 {
    mystruct = {}
    mystruct.mymap = map[string]string
    if variable_exists {
        mystruct.mymap[variable] = blah
    }
}

Затем я использую эту переменную в тонне операторов диапазона, поэтому ее нужно инициализировать.

, но в подавляющем большинстве случаев карта просто пуста так что было бы хорошо, если бы мне не нужно было инициализировать карту, чтобы оставить ее пустой. поэтому я надеюсь что-то вроде

mystruct struct {
   mymap
}
default_map = make(map[string]string)

for i range 10000 {
    mystruct = {}
    mystruct.mymap = default_map
    if variable_exists {
        if mystruct.mymap == default_map {
          mystruct.mymap = make(map[string]string)
        }
        mystruct.mymap[variable] = blah
    }
}

, но это не работает. Я нашел диплоэквивалент, но это было бы слишком медленно. большинство языков позволяют проверять, направлены ли они на один и тот же объект, так как мне это сделать в go?

1 Ответ

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

Инициализируйте поле карты с помощью nil. Сравните поле с nil перед добавлением значения на карту:

for i := 0; i < 10000; i++ {
    var m mystruct
    if variable_exists {
        if m.mymap == nil {
            m.mymap = make(map[string]string)
        }
        m.mymap[variable] = blah
    }
}
...