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-ро мебарорад
}