Как вставить данные в многомерный массив в голанге?

У меня есть динамический многомерный массив, мне нужно динамически заполнять его из цикла. как я могу определить массив и заполнить данные.

Вот код, который я пытаюсь

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, не могу найти, где что-то не так, любая помощь очень ценится.

Спасибо :)

Срезы индексируются с использованием целых чисел, и вы использовали значение string. Очевидно, это не сработает. Может быть, вам нужен фрагмент карт []map[string]float64 или фрагмент структур, описывающих ваш объект?

icza 16.10.2018 10:56

как выглядят ваши данные, поможет минимальный пример.

nilsocket 16.10.2018 10:57

«Я новичок в [Go]». Так что возьмите «Путешествие по го» и начните с более простых вещей, пока вы не освоитесь с ними, а позже перейдете к динамическим многомерным вещам.

Volker 16.10.2018 11:01

nilsocket я обновил образец данных

btc user 16.10.2018 11:26

«не удалось найти, где что-то пошло не так» Вы не мочь используете строки в качестве индексов срезов в Go. Go - это ни PHP, ни JavaScript. Вы должны попробовать карту.

Volker 16.10.2018 11:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
5
561
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Как вы определили здесь свою переменную 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?

btc user 16.10.2018 13:33
Ответ принят как подходящий

Рассмотрим это решение:

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

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