Чаро наметавонем ба арзиши нигоҳ дошташуда дар калид дар харита ишора кунем?
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-ро мебарорад
}