Зацикливание фрагмента в 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