Sepete ekleme
- Go kursu
- Başlangıç
- Ders 48/90
- 6 dk
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
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
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
s.Urunler = ____(s.Urunler, u)
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 |