hello i am a begginer in golang and i am working on a shopping cart app, every time i try to excute the code it shows "first argument to append must be slice" here is the code package cart
type Cart struct {
items map[string]Item
}
type Item struct {
id string
name string
price float32
quantity int
}
func NewItem(i string, n string, p float32) Item {
return Item{
id: i,
name: n,
price: p,
quantity: 0,
}
}
func NewCart() Cart {
return Cart{
items: map[string]Item{}}
}
func (box *Cart) AddItem(item Item) []Item {
box.items = append(box.items, item)
return box.items
}
func main() {
utils.CreateLogger("shopping-cart")
shoppingCart := cart.NewCart()
item1 := cart.NewItem("potato121", "Potato", 10)
err := shoppingCart.AddItem(item1)
}
You get the error because you tried to add an object into a map
using append()
, on this line of code:
box.items = append(box.items, item)
Meanwhile the box.items
type is a map[string]Item
.
type Cart struct {
items map[string]Item
}
The append()
built in function can only be used on a slice data type.
I'm not sure what you are trying to do, whether to use a map or a slice as the type of .items
. But if you want the .items
property to be a slice, then change your code into this:
type Cart struct {
items []Item
}
func NewCart() Cart {
return Cart{
items: make([]Item, 0)}
}
If you want the .items
property to be a map
, change your code into this:
func NewCart() Cart {
return Cart{
items: map[string]Item{}}
}
func (box *Cart) AddItem(item Item) map[string]Item {
box.items[item.id] = item
return box.items
}