Sobes.tech
Middle

Картада ачкыч менен сакталган мааниге шилтеме алуу мүмкүнбү?

sobes.tech AI

AIден жооп

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, yanlış 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. Göstərici vasitəsilə birbaşa dəyəri dəyişdirmək, əgər müxtəlif goroutine-lə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}

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

	// Düzgün yol dəyəri dəyişdirmək:
	value := m["a"] // Dəyəri əldə et
	value++         // Dəyişdir
	m["a"] = value  // Yenidən saxlama

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