У меня есть динамический многомерный массив, мне нужно динамически заполнять его из цикла. как я могу определить массив и заполнить данные.
Вот код, который я пытаюсь
var arrDetails[][]string
var index int = 0
for _, orderdetails := range ordersfromdb {
arrDetails[index]["OrderNumber"] = "001"
arrDetails[index]["customernum"] = "cust_001"
arrDetails[index]["orderstatus"] = "open"
arrDetails[index]["orderprice"] = "200"
index++
}
ошибка, с которой я сталкиваюсь:
non-integer slice index "OrderNumber"
non-integer slice index "customernum"
non-integer slice index "orderstatus"
non-integer slice index "orderprice"
Я сделал то же самое на php и отлично работает:
for ($i=0;$i<5:$i++)
{
$arr_orderdetails[$i]["OrderNumber"] = "001";
$arr_orderdetails[$i]["customernum"] = "cust_001";
$arr_orderdetails[$i]["orderstatus"] = "open";
$arr_orderdetails[$i]["orderprice"] = "200";
}
Я новичок в golang, не могу найти, где что-то не так, любая помощь очень ценится.
Спасибо :)
как выглядят ваши данные, поможет минимальный пример.
«Я новичок в [Go]». Так что возьмите «Путешествие по го» и начните с более простых вещей, пока вы не освоитесь с ними, а позже перейдете к динамическим многомерным вещам.
nilsocket я обновил образец данных
«не удалось найти, где что-то пошло не так» Вы не мочь используете строки в качестве индексов срезов в Go. Go - это ни PHP, ни JavaScript. Вы должны попробовать карту.






Как вы определили здесь свою переменную arrDetails как многомерный срез как [][]string, это означает, что вы не можете назначить string его keys, в то время как вы можете назначить строку в качестве значения.
Вы можете сделать свой код, как я упоминал ниже.
package main
import (
"fmt"
)
func main() {
var arrDetails [][]string
var s []string
var index int
for i:=0; i<5;i++ {
s = []string{"001", "cust_001", "open", "200"}
arrDetails = append(arrDetails, s)
index++
}
fmt.Printf("Hello, playground %+v", arrDetails )
}
Или, если вам нужна пара keys и value, вы можете использовать map как:
var arrDetails map[string]string
Согласно предложению Фолькера в комментарии, я заполняю многомерный массив, как показано ниже.
arrDetails[index][0] = "001"
arrDetails[index][1] = "cust_001"
arrDetails[index][2] = "open"
arrDetails[index][3] = "200"
вы можете попробовать это:
import "fmt"
func main() {
var arrDetails []map[string]string
var index int = 0
//for _, orderdetails := range ordersfromdb {
for i:=0; i<5;i++ {
detail := make(map[string]string)
detail["OrderNumber"] = "001"
detail["customernum"] = "cust_001"
detail["orderstatus"] = "open"
detail["orderprice"] = "200"
arrDetails = append(arrDetails, detail)
index++
}
fmt.Printf("Hello, playground %+v", arrDetails )
}
можем ли мы преобразовать результат в json? json.Marshal?
Рассмотрим это решение:
arrDetails := map[int]map[string]string{}
index := 0
for _, orderdetails := range ordersfromdb {
arrDetails[index] = map[string]string{} // you have to initialize map
arrDetails[index]["OrderNumber"] = "001"
arrDetails[index]["customernum"] = "cust_001"
arrDetails[index]["orderstatus"] = "open"
arrDetails[index]["orderprice"] = "200"
index++
}
Чтобы преобразовать результаты в json (как я видел ваш вопрос в комментарии к ответу @liao yu), мы должны узнать больше о теги:
import (
"encoding/json"
"fmt"
)
type OrderDetails struct {
Number string `json:"number"`
Customer string `json:"customer"`
Status string `json:"status"`
Price string `json:"price"`
}
func main() {
ordersfromdb := []int{1, 2, 3}
var arrDetails []OrderDetails
for _, v := range ordersfromdb {
arrDetails = append(arrDetails, OrderDetails{
Number: fmt.Sprintf("order_number_%v", v),
Customer: fmt.Sprintf("customer_%v", v),
Status: fmt.Sprintf("order_status_%v", v),
Price: fmt.Sprintf("$%v", v),
})
}
data, err := json.Marshal(arrDetails)
if err != nil {
panic(err)
}
fmt.Println(string(data))
}
Смотрите на детской площадке: https://play.golang.org/p/IA0G53YX_dZ
Срезы индексируются с использованием целых чисел, и вы использовали значение
string. Очевидно, это не сработает. Может быть, вам нужен фрагмент карт[]map[string]float64или фрагмент структур, описывающих ваш объект?