Ինչու չենք կարող վերցնել հղում այն արժեքին, որը պահվում է բանալիով քարտեզում?
sobes.tech AI
Պատասխան AI-ից
Golang-ում, քարտեզը (map) ներկայացնում է հեշ-թերթ։ Ավելացնել կամ հեռացնել տարրեր կարող է հանգեցնել քարտեզի ներքին կառուցվածքի փոփոխության, ներառյալ հիշողության վերաօգտագործումը և տարրերի տեղափոխումը։ Եթե վերցնեք ցուցիչ արժեքի վրա, որը պահվում է բանալիով, և ապա փոփոխեք քարտեզը (օրինակ՝ ավելացնելով կամ հեռացնելով այլ տարր), այդ ցուցիչը կարող է դառնալ անվավեր, ցույց տալով սխալ հիշողության տարածք կամ այլ արժեք։ Golang-ը կանխում է դա կոմպիլյացիայի ժամանակ, արգելելով քարտեզի տարրերի հասցե վերցնելը։
Բացի այդ, Golang-ի քարտեզը չի ապահովված բազմաթելային (thread-safe) օգտագործման համար։ Ուղիղ փոփոխությունը ցուցիչով կարող է հանգեցնել մրցակցության պայմանների, եթե միաժամանակ մի քանի goroutine-ներ մուտք ունենան, ինչը բարդացնում է սինխրոնիզացիան։ Քարտեզի արժեքի ցուցիչ վերցնելու արգելքը պարզեցնում է միաժամանակյա մուտքի մոդելը և հստակեցնում է սինխրոնիզացիայի մեխանիզմների (օրինակ՝ sync.RWMutex) օգտագործման անհրաժեշտությունը բազմաթելային միջավայրում։
Քարտեզի միջոցով արժեքը փոխելու համար անհրաժեշտ է ստանալ արժեքը, փոխել այն և այնուհետև վերագրել այն քարտեզին՝
package main
import "fmt"
func main() {
m := map[string]int{"a": 1}
// Չի կարելի վերցնել ցուցիչ քարտեզի արժեքին
// ptr := &m["a"] // Կոմպիլյացիայի սխալ
// Ճիշտ մեթոդը արժեքը փոխելու համար:
value := m["a"] // Ստանալ արժեքը
value++ // Փոխել արժեքը
m["a"] = value // Վերագրել փոփոխված արժեքը
fmt.Println(m["a"]) // Տպել 2
}