Sobes.tech
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()