CodeBlanks Logo Icon CodeBlanks

Sepete ekleme

append ile sepete ürün eklersin.

Sepete ekleme

Sepet, ürünlerden oluşan bir dilimdir. Ekleme append ile yapılır. Aynı ürün ikinci kez eklenirse yeni satır yerine adet artırılmalıdır; bunun için önce sepette arama yapılır:

type Sepet struct{ Urunler []Urun }

func (s *Sepet) Ekle(u Urun) {
    for i := range s.Urunler {
        if s.Urunler[i].Ad == u.Ad {
            s.Urunler[i].Adet += u.Adet
            return
        }
    }
    s.Urunler = append(s.Urunler, u)
}

for i := range ile değiştirme

Adedi artırırken for _, u := range s.Urunler kullanmak işe yaramaz: u kopyadır ve değişiklik dilime yansımaz. Bu yüzden dizinle gezip s.Urunler[i].Adet üzerinden değiştiririz. Bu hata Go'ya yeni başlayanların en sık yaptığı hatalardan biridir.

Uygulama Ekle yöntemi

Urun, Sepet ve Ekle yöntemini yaz. Sepete Kalem (3 adet), Defter (1 adet) ve tekrar Kalem (2 adet) ekle. Ürün sayısını ve kalemin adedini yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

type Urun struct {
    Ad    string
    Fiyat float64
    Adet  int
}

type Sepet struct{ Urunler []Urun }

func (s *Sepet) Ekle(u Urun) {
    for i := range s.Urunler {
        if s.Urunler[i].Ad == u.Ad {
            s.Urunler[i].Adet += u.Adet
            return
        }
    }
    s.Urunler = append(s.Urunler, u)
}

func main() {
    var s Sepet
    s.Ekle(Urun{"Kalem", 12.5, 3})
    s.Ekle(Urun{"Defter", 20, 1})
    s.Ekle(Urun{"Kalem", 12.5, 2})
    fmt.Println(len(s.Urunler), s.Urunler[0].Adet)
}

Beklenen çıktı

2 5

Soru ve cevaplar

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

1 <code>Ekle</code> neden işaretçi alıcı (<code>*Sepet</code>) kullanır?

  • Daha kısa olduğu için
  • Dilimler işaretçi gerektirdiği için
  • Zorunlu değildir
  • Sepetin kendisini değiştirmek için; değer alıcı kopya üzerinde çalışırdı Doğru cevap

Açıklama: append yeni dilim başlığı döndürür; bunu Sepet'e kalıcı yazmak için alıcının işaretçi olması gerekir.

2 Sona ekle

Soru
s.Urunler = ____(s.Urunler, u)
Cevap
s.Urunler = append(s.Urunler, u)

Açıklama: append yeni ürünü dilimin sonuna ekler; sonuç tekrar alana atanır.

3 Durum ve davranış

Kavram Anlamı
Yeni ürün append ile eklenir
Var olan ürün Adet artar
for _, u := range Kopya, işe yaramaz
*Sepet Kalıcı değişiklik

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