Могу ли я как обновить, так и получить элемент на карте без двух индексных вызовов? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть карта с целочисленными значениями. Я хочу обновить значение, а затем проверить, превышает ли обновленное значение пороговое значение.

Если бы мне не нужно было проверять новое значение, я просто сделал бы

map[key] += 1

Очевидное изменение, если я хочу проверить новое значение:

old_val := map[key]
new_val := old_val + 1
map[key] = new_val
if (new_val > threshold) {
    return
}

Однако это делает два индексных вызова карты, что не обязательно является операцией с постоянным временем.

Я хотел бы сделать что-то вроде:

val_p := &(map[key])
*(val_p) += 1
if (*(val_p) > threshold) {
    return
}

Однако карты GoLang не предназначены для адресации, поскольку адреса, очевидно, могут измениться (хотя в этом случае это не изменится, потому что я не изменяю карту).

Есть ли какая-нибудь функция, которую я мог бы использовать для обновления элемента на карте, который возвращает новое значение? Специально для целых чисел?

1 Ответ

1 голос
/ 21 марта 2019

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

Что вы можете сделать, это сохранить упаковку или указатель на карте, и вам нужно толькоищите значение, и вам нужно сделать это только один раз;изменение данных - это изменение указанного значения, которое находится за пределами карты, поэтому вам не нужно переназначать (указатель не изменяется).

Например:

const threshold = 3

m := map[string]*int{
    "one": new(int),
}

for {
    p := m["one"]
    fmt.Println("data=", *p)
    *p++
    if *p > threshold {
        fmt.Println("threshold reached", *p)
        break
    }
}

Это выводит (попробуйте на Go Playground ):

data= 0
data= 1
data= 2
data= 3
threshold reached 4

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

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