связь между add key / value и методом mapassign в go1.10.3 - PullRequest
0 голосов
/ 04 ноября 2018

Я читаю исходный код карты в go1.10.3 . Казалось, существует соответствующий метод для операции, такой как:

 makemap(t *maptype, hint int, h *hmap) *hmap ==> m = make(map[xx]yy)
 mapaccess1(t *maptype, h *hmap, key unsafe.Pointer)==> m['key']

но я не могу найти соответствующий метод для операции, которая добавляет ключ / значение, как показано ниже:

 m['xx']='yy'

существует метод mapassign, который имеет некоторое сходство с этим работа.

 mapassign(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer

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

        if !alg.equal(key, k) {
            continue
        }
        // already have a mapping for key. Update it.
        if t.needkeyupdate {//why??
            typedmemmove(t.key, k, key)
        }

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

Резюме:
1. связь между операцией добавления ключа / значения и методом mapassign ?
2. почему может потребоваться обновить ключ, поскольку ключ вставки и ключ, который уже существует, равны в методе mapassign?

1 Ответ

0 голосов
/ 04 ноября 2018
  1. В операции m[k] = v вызывающая сторона копирует значение v на адрес, возвращаемый mapassign.

  2. Комментарии в функции needkeyupdate объясняют, почему некоторые типы требуют обновления ключа: числа с плавающей запятой и комплексные -0 и 0 равны, но разные значения; Строка может иметь меньший резервный запас.

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