CodeBlanks Logo Icon CodeBlanks

Map'te arama

Map'ten anahtarla değer almayı ve varlık kontrolünü öğrenirsin.

Map'te arama: comma-ok

Bir anahtarın gerçekten var olup olmadığını anlamak için iki değerli okuma kullanılır:

fiyat := map[string]float64{"kalem": 12.5, "hediye": 0}

if f, ok := fiyat["hediye"]; ok {
    fmt.Println("var:", f)   // var: 0
}
if _, ok := fiyat["silgi"]; !ok {
    fmt.Println("silgi yok")
}

Yalnızca fiyat["hediye"] okusaydın 0'ın "bedava" mı yoksa "yok" mu olduğunu ayırt edemezdin.

Küme olarak map

Go'da ayrı bir küme türü yoktur; map[T]bool ya da bellek açısından daha iyi olan map[T]struct{} kullanılır:

gorulen := map[string]bool{}
for _, ad := range []string{"ada", "can", "ada"} {
    if gorulen[ad] {
        fmt.Println("tekrar:", ad)
        continue
    }
    gorulen[ad] = true
}

map[T]bool ile olmayan anahtar false döndüğü için comma-ok gerekmez.

Uygulama Fiyat sorgusu

fiyatSor(m map[string]float64, ad string) string yaz: ürün varsa fmt.Sprintf("%s: %.2f", ad, f), yoksa ad + " bulunamadı" döndürsün. "kalem" ve "silgi" için sonuçları yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

func fiyatSor(m map[string]float64, ad string) string {
    if f, ok := m[ad]; ok {
        return fmt.Sprintf("%s: %.2f", ad, f)
    }
    return ad + " bulunamadı"
}

func main() {
    m := map[string]float64{"kalem": 12.5}
    fmt.Println(fiyatSor(m, "kalem"))
    fmt.Println(fiyatSor(m, "silgi"))
}

Beklenen çıktı

kalem: 12.50
silgi bulunamadı

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>v, ok := m[k]</code> ifadesinde anahtar yoksa ne döner?

  • panic
  • Son değer ve true
  • Sıfır değer ve false Doğru cevap
  • nil ve error

Açıklama: ok yalnızca anahtar varsa true olur; v ise yoksa değer türünün sıfır değeridir.

2 Varlık kontrolü

Soru
if _, ____ := stok["kalem"]; !ok {
    fmt.Println("stokta yok")
}
Cevap
if _, ok := stok["kalem"]; !ok {
    fmt.Println("stokta yok")
}

Açıklama: İkinci değer anahtarın map'te olup olmadığını bildiren bool'dur.

3 Okuma ve sonuç

Kavram Anlamı
m["var"] Değer
m["yok"] Sıfır değer
_, ok := m["yok"] ok = false
map[string]bool Küme

Başlangıç bölümündeki tüm dersler