первый аргумент для добавления должен быть slice (struct и golang) - PullRequest
0 голосов
/ 08 декабря 2018

привет, я новичок в golang, и я работаю над приложением корзины для покупок, каждый раз, когда я пытаюсь извинить код, который он показывает «первый аргумент для добавления должен быть кусочком», вот корзина кода пакета

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)
}

1 Ответ

0 голосов
/ 08 декабря 2018

Вы получаете ошибку, потому что вы пытались добавить объект в map, используя append(), в этой строке кода:

box.items = append(box.items, item)

Между тем тип box.items является map[string]Item.

type Cart struct {
    items map[string]Item
}

Встроенная функция append() может использоваться только с типом данных среза .


Я не уверен, кто выпытаясь сделать, использовать ли карту или фрагмент в качестве типа .items.Но если вы хотите, чтобы свойство .items было слайсом, измените свой код на следующий:

type Cart struct {
    items []Item
}

func NewCart() Cart {
    return Cart{
        items: make([]Item, 0)}
}

Если вы хотите, чтобы свойство .items было map, измените свой код на этот:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...