Почему нельзя взять адрес значения в map?

Middle
568 просмотров
AFK Offer AI

Нельзя написать &m["key"] потому что map может в любой момент рехешироваться, и элемент переедет в другой бакет. Указатель станет невалидным.

m := map[string]User{"alice": {Name: "Alice"}}
// p := &m["alice"]     // compile error!
// m["alice"].Name = "" // тоже ошибка!

Решения:

// 1. Копия
u := m["alice"]
u.Name = "Bob"
m["alice"] = u

// 2. Map указателей m2 := map[string]*User{"alice": {Name: "Alice"}} m2["alice"].Name = "Bob" // OK

В слайсе можно брать адрес элемента (&s[0]), но это тоже опасно — при append слайс может переехать.

Следующий вопрос

Что такое SELECT FOR UPDATE?