Prečo nemôžeme vziať odkaz na hodnotu uloženú podľa kľúča v mape?
sobes.tech AI
Odpoveď od AI
V Golang-u, mapa (map) predstavlja hash tablicu. Pridanie alebo odstránenie prvkov môže viesť k zmenám vnútornej štruktúry mapy, vrátane preusporiadania pamäte a presunu prvkov. Ak vezmete ukazovateľ na hodnotu uloženú pod kľúčom a potom mapu zmeníte (napríklad pridaním alebo odstránením iného prvku), tento ukazovateľ môže byť neplatný, ukazujúc na nesprávnu oblasť pamäte alebo na inú hodnotu. Golang tomu bráni počas kompilácie, zakazujúc brať adresu prvku mapy.
Okrem toho, mapa v Golang nie je vlákno bezpečná (thread-safe). Priama zmena hodnoty cez ukazovateľ by mohla viesť k stavu závodu, ak na ňu pristupujú rôzne gorutiny súčasne, čo sťažuje synchronizáciu. Zákaz brať ukazovateľ na hodnotu v mape zjednodušuje model paralelného prístupu a robí explicitnou potrebu použitia synchronizačných mechanizmov (napríklad sync.RWMutex) pri práci s mapami v prostredí s viacerými vláknami.
Ak chcete zmeniť hodnotu podľa kľúča, musíte získať hodnotu, upraviť ju a potom ju uložiť späť do mapy:
package main
import "fmt"
func main() {
m := map[string]int{"a": 1}
// Nie je možné vziať ukazovateľ na hodnotu v mape
// ptr := &m["a"] // Chyba kompilácie
// Správny spôsob zmeny hodnoty:
value := m["a"] // Získať hodnotu
value++ // Upraviť hodnotu
m["a"] = value // Uložiť upravenú hodnotu
fmt.Println(m["a"]) // Vypíše 2
}