Zašto ne možemo uzeti referencu na vrednost koja je sačuvana po ključu u mapu?
sobes.tech АИ
Одговор од АИ
U Golang-u, mapa (map) predstavlja tabelu heša. Dodavanje ili uklanjanje elemenata može dovesti do promena u unutrašnjoj strukturi mape, uključujući redistribuciju memorije i pomeranje elemenata. Ako uzimate pokazivač na vrednost koja je sačuvana po ključu, a zatim izmenite mapu (na primer, dodavanjem ili uklanjanjem drugog elementa), taj pokazivač može postati nevažeći, ukazujući na pogrešnu memorijsku oblast ili na drugu vrednost. Golang to sprečava u fazi kompajliranja, zabranjujući uzimanje adrese elementa mape.
Pored toga, mapa u Golang-u nije thread-safe. Direktna izmena vrednosti putem pokazivača može dovesti do uslova trke ako više gorutina pristupa istovremeno, što otežava sinhronizaciju. Zabrana uzimanja pokazivača na vrednost u mapi pojednostavljuje model paralelnog pristupa i čini eksplicitnom potrebu za korišćenjem mehanizama sinhronizacije (npr. sync.RWMutex) pri radu sa mapama u višestrukim nitima.
Da biste izmenili vrednost po ključu, potrebno je da dobijete vrednost, izmenite je, a zatim je sačuvate nazad u mapu:
package main
import "fmt"
func main() {
m := map[string]int{"a": 1}
// Nije moguće uzeti pokazivač na vrednost u mapi
// ptr := &m["a"] // Greška pri kompilaciji
// Ispravan način za izmenu vrednosti:
value := m["a"] // Dobijanje vrednosti
value++ // Izmena vrednosti
m["a"] = value // Čuvanje izmenjene vrednosti
fmt.Println(m["a"]) // Ispisaće 2
}