Sobes.tech
Middle

Xəritədə açar ilə saxlanılan dəyərə istinad edə bilməməyimizin səbəbi nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Golang-da xəritə (map) hash cədvəlini təmsil edir. Elementlərin əlavə olunması və ya silinməsi xəritənin daxili strukturunda dəyişikliklərə, o cümlədən yaddaşın yenidən bölüşdürülməsinə və elementlərin köçürülməsinə səbəb ola bilər. Əgər açar ilə saxlanılan dəyərə göstərici götürsəniz və sonra xəritəni dəyişdirsəniz (məsələn, başqa element əlavə və ya silinsə), bu göstərici etibarsız ola bilər, düzgün olmayan yaddaş sahəsinə və ya başqa bir dəyərə işarə edə bilər. Golang bunu tərtibat mərhələsində qarşısını alır və xəritədən elementin ünvanını götürməyi qadağan edir.

Bundan başqa, Golang-da xəritə çoxmərhələli (thread-safe) deyil. Birbaşa göstərici vasitəsilə dəyəri dəyişdirmək, əgər müxtəlif gorutinlər paralel olaraq ona daxil olursa, yarış şəraitinə səbəb ola bilər və bu, sinxronizasiyanı çətinləşdirir. Xəritədən dəyərə göstərici götürməyin qadağan olunması, çoxmərhələli giriş modelini sadələşdirir və çoxmərhələli mühitdə xəritə ilə işləyərkən sinxronizasiya mexanizmlərinin (məsələn, sync.RWMutex) istifadəsini açıq şəkildə göstərir.

Açar ilə dəyəri dəyişdirmək üçün, əvvəlcə dəyəri əldə etmək, onu dəyişdirmək və sonra dəyişdirilmiş dəyəri yenidən xəritəyə saxlamaq lazımdır:

package main

import "fmt"

func main() {
	m := map[string]int{"a": 1}

	// Xəritədəki dəyərə göstərici götürmək mümkün deyil
	// ptr := &m["a"] // Tərtibat xətası

	// Dəyəri düzgün dəyişdirməyin yolu:
	value := m["a"] // Dəyəri əldə et
	value++         // Dəyəri dəyiş
	m["a"] = value  // Dəyişdirilmiş dəyəri saxla

	fmt.Println(m["a"]) // 2 çap edəcək
}