Sobes.tech
Middle

Haritada anahtar ile saklanan değere referans alınamamasının nedeni nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Golang'da map, bir karma tabloyu temsil eder. Öğeleri eklemek veya silmek, map'in iç yapısında değişikliklere yol açabilir; bu, belleğin yeniden dağıtılması ve öğelerin taşınmasını içerebilir. Bir anahtar tarafından saklanan değere işaretçi alınırsa ve sonra map değiştirilirse (örneğin, başka bir öğe eklenir veya silinir), bu işaretçi geçersiz hale gelebilir, yanlış bellek alanına veya başka bir değere işaret edebilir. Golang, derleme aşamasında bunu engeller ve map'ten öğe adresi alınmasını yasaklar.

Ayrıca, Golang'da map, thread-safe değildir. Bir değere doğrudan işaretçi aracılığıyla yapılan değişiklikler, farklı goroutine'ler paralel erişim sağladığında yarış koşullarına neden olabilir, bu da senkronizasyonu zorlaştırır. Map'ten değer işaretçisi alınmasını engellemek, eşzamanlı erişim modelini basitleştirir ve çok iş parçacıklı ortamda map ile çalışırken senkronizasyon mekanizmalarının (örneğin, sync.RWMutex) kullanımını açık hale getirir.

Bir anahtar ile değeri değiştirmek için, değeri almak, değiştirmek ve sonra değiştirilmiş değeri tekrar map'e kaydetmek gerekir:

package main

import "fmt"

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

	// Map'teki değere işaretçi alınamaz
	// ptr := &m["a"] // Derleme hatası

	// Değeri doğru şekilde değiştirme:
	value := m["a"] // Değeri al
	value++         // Değeri değiştir
	m["a"] = value  // Değiştirilmiş değeri tekrar kaydet

	fmt.Println(m["a"]) // 2 yazdırır
}