Sobes.tech
Middle

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
}