Go’da Map Referans Type mı?

Ömer Burak Demirpolat
2 min readJan 31, 2022

--

Referans type kavramı aslında bir çok programlama dilinde olduğu gibi Go için de aynı diyebiliriz fakat bir kaç farklı durum söz konusu, bu yazı içerisinde bunlardan bahsedeceğim.

Map’ler Go programlama bir hash table implementasyonudur.

Map’in header’ı runtime package’ı içerisindeki hmap adlı struct’a point eder ve içerisinde length(uzunluk), bucket’ları işaret eden bir pointer bulunur.

Uzunluk ifadesi zaten oldukça açık, map içerisinde kaç tane var, bunu döndürüyor.

Peki, ne demek bucket’ları işaret eden pointer ve ne işe yarar?

Bucket’lar map içerisindeki key ve value’ları barındırır, güzel ama bir de pointer olduğundan bahsettik, bunun nedenini açıklayalım.

m := make(map[string]string)

Şeklinde bir ifade bize bir pointer döndürmez, map tipinde bir value döndürür. Peki, biz bu “m” adlı değişkeni bir başka fonksiyona parametre olarak geçsek ve içerisine bir key/value eklesek “m” değişkeni etkilenecek mi? Yani kısaca gerçekten referans type mı bunu kontrol edecek bir şey yapalım.

func change(xxx map[string]string) {
xxx["test"] = "test"
}
func main() {
m := make(map[string]string)
change(m)
fmt.Println(m)
}

Programımız çıktı olarak:

map[test:test]

Evet, value olarak geçtiğimiz map’in içerisine bir key/value ekledik ve “m” adlı değişkenin orjinalini değiştirebildik.

İşte bunu yapabilmemizin sebebi az önce bahsettiğim bucket’lara işaret eden pointer.

Aslında bu doğrultuda map tipi referans type gibi duruyor.

Aslında biz “change” fonksiyonuna “m” adlı değişkeni geçtiğimizde “m” değişkeni kopyalandı, sonuçta pointer geçmedik.

Ama kopyalanan map içerisinde map header’ında bucket’lara işaret eden pointer’da kopyalandı. Kısacası aynı pointer kullanıldı.

Bunu şöyle anlayabiliriz. “m” ve “xxx” adlı değişkenlerin pointer’larına bakalım. Aynı mı yoksa değil mi?

func change(xxx map[string]string) {
fmt.Println(unsafe.Pointer(&xxx)) // 0xc0000b2028
}
func main() {
m := make(map[string]string)
fmt.Println(unsafe.Pointer(&m)) // 0xc0000b2018
}

“m” adlı değişkeni “change” adlı fonksiyona geçtiğimizde kopyalandığını söylemiştim, görüldüğü üzere iki farklı bellek adresi oluştu. Yani bunlar farklı değişkenler ama içerisindeki bucket’lara işaret eden pointer aynı bu nedenle “change” fonksiyonunda yaptığımız key/value ekleme işleminde “m” adlı değişkenin bucket’ları da değişti, “xxx” adlı değişkenin bucket’ları da değişti.

Peki son bir test daha yapalım ve bunu yorumlayalım.

func change(xxx map[string]string) {
xxx = make(map[string]string)
}
func main() {
m := map[string]string{"test": "test"}
change(m)
fmt.Println(m) // map[test:test]
}

Bu sefer ilk olarak içerisinde “test:test” şeklinde key/value bulunan bir map yarattım, bunu “change” fonksiyonuna geçtim ve “change” fonksiyonunda “xxx” adlı değişkene boş bir map atamayı denedim. Aslında map bir pointer olsaydı “m” değişkenine de boş bir map atamış olacaktım fakat “change” fonksiyonuna geçtiğimizde “m” adlı değişken kopyalandı ve “xxx” farklı bir adrese point ediyor bu doğrultuda sadece “xxx” adlı değişkene boş bir map atayabildim.

Peki “change” fonksiyonunda ufak bir değişiklik yapalım.

func change(xxx map[string]string) {
delete(xxx, "test")
}
func main() {
m := map[string]string{"test": "test"}
change(m)
fmt.Println(m) // map[]
}

Bu kod aşağıdaki gibi sonuç verdi.

map[]

“delete” fonksiyonu ile “test” adlı key’i sildik ve bu doğrultuda “m” adlı değişken de değişecektir çünkü “delete” fonksiyonu ile silme işlemi bucket’lara işaret eden pointer ile yapılıyor bu doğrultuda hem “xxx” hem de “m” değişkenleri de değişecektir.

Bizim bir önceki aşamada yaptığımız ise “xxx” adındaki farklı bir fonksiyona boş map atamak şeklindeydi.

Aslında bu yazımın sebebi bugün böyle bir kod ile karşılaşmam doğrultusunda oluştu.

Refaranslar:

Okuduğunuz için teşekkürler.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response