CodeBlanks Logo Icon CodeBlanks

Meydan okuma 4 - Mini uygulama

Map, struct ve fonksiyonla bir envanter yazarsın.

Meydan okuma: telefon rehberi

Map, struct ve fonksiyonları birleştiren küçük bir rehber uygulaması yazacaksın. Rehber türü kişileri adlarına göre bir map'te tutar ve üç yöntem sunar:

type Kisi struct {
    Ad    string
    Tel   string
}

type Rehber struct{ kisiler map[string]Kisi }

func (r *Rehber) Ekle(k Kisi) error   // ad zaten varsa hata
func (r *Rehber) Bul(ad string) (Kisi, bool)
func (r *Rehber) Liste() []string       // adlar, alfabetik

Plan

1) Ekle: r.kisiler == nil ise make ile oluştur; _, var := r.kisiler[k.Ad] ile tekrarı kontrol edip fmt.Errorf("%s zaten kayıtlı", k.Ad) döndür; yoksa ekle. 2) Bul: comma-ok ile döndür. 3) Liste: anahtarları dilime al, slices.Sort ile sırala.

Uygulama Rehber uygulaması

Plana göre Rehber'i yaz. Can ve Ada'yı ekle, Ada'yı tekrar eklemeyi dene ve hatayı yazdır; sonra r.Liste() ve r.Bul("Can") ile bulunan telefonu yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "slices"
)

type Kisi struct {
    Ad  string
    Tel string
}

type Rehber struct{ kisiler map[string]Kisi }

func (r *Rehber) Ekle(k Kisi) error {
    if r.kisiler == nil {
        r.kisiler = make(map[string]Kisi)
    }
    if _, exists := r.kisiler[k.Ad]; exists {
        return fmt.Errorf("%s zaten kayıtlı", k.Ad)
    }
    r.kisiler[k.Ad] = k
    return nil
}

func (r *Rehber) Bul(ad string) (Kisi, bool) {
    k, ok := r.kisiler[ad]
    return k, ok
}

func (r *Rehber) Liste() []string {
    adlar := make([]string, 0, len(r.kisiler))
    for ad := range r.kisiler {
        adlar = append(adlar, ad)
    }
    slices.Sort(adlar)
    return adlar
}

func main() {
    var r Rehber
    r.Ekle(Kisi{"Can", "555-0101"})
    r.Ekle(Kisi{"Ada", "555-0199"})
    fmt.Println(r.Ekle(Kisi{"Ada", "555-0000"}))
    fmt.Println(r.Liste())
    if k, ok := r.Bul("Can"); ok {
        fmt.Println(k.Tel)
    }
}

Beklenen çıktı

Ada zaten kayıtlı
[Ada Can]
555-0101

Soru ve cevaplar

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

1 <code>var r Rehber; r.Ekle(...)</code> neden çökebilir?

  • Çökmez
  • kisiler map'i nil'dir ve nil map'e yazılamaz Doğru cevap
  • Ekle tanımsızdır
  • Rehber bir işaretçi olmalı

Açıklama: Ekle içinde map nil ise önce make ile oluşturmak (ya da NewRehber yapıcısı yazmak) bu hatayı önler.

2 Map'i başlat

Soru
if r.kisiler == nil {
    r.kisiler = ____(map[string]Kisi)
}
Cevap
if r.kisiler == nil {
    r.kisiler = make(map[string]Kisi)
}

Açıklama: make yazılabilir bir map oluşturur; nil map'e yazmak panic üretirdi.

3 Yöntem ve dönüş

Kavram Anlamı
Ekle error
Bul (Kisi, bool)
Liste []string (sıralı)
nil map make ile başlat

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