Meydan okuma 4 - Mini uygulama
- Go kursu
- Başlangıç
- Ders 90/90
- 8 dk
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, alfabetikPlan
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
package main
import (
"fmt"
"slices"
)
func main() {
// buraya yaz
}Örnek çözüm
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
if r.kisiler == nil {
r.kisiler = ____(map[string]Kisi)
}
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 |