Sobes.tech
Middle

Ինչու չենք կարող վերցնել հղում այն արժեքին, որը պահվում է բանալիով քարտեզում?

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
}