Зацикливание фрагмента в Go для создания карты

Я перебираю фрагмент в Go, состоящий из созданной мной структуры под названием Product.

Я хочу превратить этот фрагмент в карту, чтобы идентификатор продукта был ключом, а продукт — значением.

Вот структура, которую я создал.

      type Product struct {
    productID      int    `json:"prodId"`
    Manufacturer   string `json:"manufacturer"`
    PricePerUnit   string `json:"ppu"`
    Sku            string `json:"sku"`
    Upc            string `json:"upc"`
    QuantityOnHand int    `json:"qoh"`
    ProductName    string `json:"prodName"`
}

и вот функция, которую я создал...

      func loadProductMap() (map[int]Product, error) {
    fileName := "products.json"
    _, err := os.Stat(fileName) //os package with the Stat method checks to see if the file exists
    if os.IsNotExist(err) {
        return nil, fmt.Errorf("file [%s] does not exist", fileName)
    }

    file, _ := ioutil.ReadFile(fileName)             //reads the file and returns a file and an error; not concerned with the error
    productList := make([]Product, 0)                //initialize a slice of type Product named productList, length is zero
    err = json.Unmarshal([]byte(file), &productList) // unmarshal/decode the json file and map it into the productList slice
    if err != nil {
        log.Fatal(err)
    }
    prodMap := make(map[int]Product) //initialize another variable called prodMap and make a map with the map key being an integer and the value being of type Product
    fmt.Println(len(productList))
    for i := 0; i < len(productList); i++ { //loop over the productList slice
        prodMap[productList[i].productID] = productList[i] //the productMap's key will be the productList product's ID at i and it's value will be the actual product (name, manufacturer, cost, etc) at productList[i]
        fmt.Println(prodMap)
    }
    fmt.Println(prodMap)
    return prodMap, nil
}

Там намного больше кода, но все работает правильно, кроме цикла for. Когда я распечатываю карту продукции в цикле for, она индивидуально просматривает каждый элемент в productList (190 элементов), но затем возвращает только один элемент - последний. Должен ли я каким-то образом добавлять каждую итерацию к карте? Я кодировал вместе с видеоуроком, и у меня есть исходный файл из обучающего видео, и я не могу найти ничего плохого в моем коде по сравнению с их кодом....

2 ответа

Поле структуры productIdне экспортируется, поэтому json.Unmarshalне можете установить его, и все ваши идентификаторы продуктов равны нулю. Экспортируйте это: ProductId, и это должно работать.

Вы не сможете получить доступ к полю структуры. Это связано с тем, что это неожиданное поле, что означает, что оно похоже на частную переменную структуры.

Вы можете изменить свое поле productID-> , что делает ваше поле структуры экспортируемым сейчас (поскольку имя переменной начинается с верхнего регистра, оно будет похоже на общедоступную переменную на другом языке). Ваш json.Unmarshalтеперь сможет с радостью получить доступ к ProductID

Другие вопросы по тегам