填充切片时索引超出范围

index out of range when filling a slice

我正在编写一个从 csv 读取的 Go 函数,将行存储到一个结构对象中,然后将每个结构对象存储在一个结构数组中:

 type Asset struct {
        Id    string `json:"id"`
        Color string `json:"color"`
        Owner string `json:"owner"`
    }


func main() {
    csvFile, err := os.Open("assets.csv")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println("Successfully Opened CSV file")
    defer csvFile.Close()

    //Read csv into an object
    csvLines, err := csv.NewReader(csvFile).ReadAll()
    if err != nil {
        fmt.Println(err)
    }

    var assts []Asset
    i := 0
    //Read CSV lines and put them into an object. Then read from the object
    for _, line := range csvLines {
        asst := Asset{
            Id:    line[0],
            Color: line[1],
            Owner: line[2],
        }
        assts[i] = asst
        i = i + 1
    }
}

但是我一直收到这个错误:

panic: runtime error: index out of range [0] with length 0

行中:assts[i] = asst

这不是将对象存储在结构数组中的正确方法吗?

任何帮助将不胜感激。

问题是您正在创建一个 lice(命名为 assts)并且您正在像数组一样使用它。 对于切片,您必须使用 append 方法。
使用数组(具有固定长度),您可以使用索引将值分配给 特定位置,或 append 方法。
注意:如果您在数组上使用 append,您将增加要添加的元素数量的数组长度。这意味着您将在数组的最大索引之后添加元素。

您可以使用以下代码来读取 CSV。

package main

import (
    "fmt"
    csvutils "github.com/alessiosavi/GoGPUtils/csv"
    "io/ioutil"
)

type Asset struct {
    Id    string `json:"id"`
    Color string `json:"color"`
    Owner string `json:"owner"`
}

func main() {
    data, err := ioutil.ReadFile("assets.csv")
    if err != nil {
        panic(err)
    }
    headers, csvData := csvutils.ReadCSV(data, ',')
    var assets []Asset = make([]Asset, len(csvData))
    fmt.Println("The csv file have the following headers: ", headers)

    for i, line := range csvData {
        asst := Asset{
            Id:    line[0],
            Color: line[1],
            Owner: line[2],
        }
        assets[i] = asst
    }
}