Junior — Middle
Je bezpečné meniť obsah slice v pamäti bez ďalších kontrol?
sobes.tech AI
Odpoveď od AI
V jazyku Go je rez (slice) štruktúra, ktorá obsahuje ukazovateľ na pole, dĺžku a kapacitu. Je možné meniť obsah rezu v pamäti, ale bezpečnosť závisí od kontextu:
- Ak sa rez nezdieľa medzi gorutinami, zmena prvkov je bezpečná bez ďalších kontrol.
- Ak sa rez používa súčasne v niekoľkých gorutinách, je potrebné synchronizovať prístup (napríklad pomocou mutexov), inak môžu nastať súťažné podmienky.
- Zmena dĺžky alebo kapacity rezu (pomocou append) môže viesť k alokácii nového poľa, takže odkazy na staré pole môžu byť neplatné.
Preto je bezpečné meniť obsah rezu bez ďalších kontrol iba v prostredí s jedným vláknom alebo pri zaručenej synchronizácii.
Príklad bezpečnej zmeny:
s := []int{1, 2, 3}
s[0] = 10 // bezpečné, ak nie sú konkurujúce gorutiny
Pre konkurenčný prístup:
var mu sync.Mutex
mu.Lock()
s[0] = 10
mu.Unlock()