填充切片时索引超出范围
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
}
}
我正在编写一个从 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
}
}