Go 使用切片时索引超出范围
我正在尝试将旧版本jsonline转换为具有不同结构的新版本 现在,旧文件具有以下结构Go 使用切片时索引超出范围,go,range,slice,indexoutofboundsexception,Go,Range,Slice,Indexoutofboundsexception,我正在尝试将旧版本jsonline转换为具有不同结构的新版本 现在,旧文件具有以下结构 {"user": "myname", "uuid": "1242315425", "data": {"Niveau1": ["AUTRE", "RC"], "Niveau2": ["RA06"], "N
{"user": "myname", "uuid": "1242315425", "data": {"Niveau1": ["AUTRE", "RC"], "Niveau2": ["RA06"], "Niveau3": ["RA06_01"]}}
{"user": "myname", "uuid": "1242315425","annotation":{"classifications":{"Niveau1":{"labels":[{"value":"AUTRE"}, {"value":"RC"}]}, "Niveau2": {"labels": [{"value":"RA06"}], "Niveau3": {"labels": [{"value":"RA06_01"}]}}}}
但是,Niveau2和Niveau3并不总是存在,列表的长度也不总是相同的
新文件的结构更复杂
{"user": "myname", "uuid": "1242315425", "data": {"Niveau1": ["AUTRE", "RC"], "Niveau2": ["RA06"], "Niveau3": ["RA06_01"]}}
{"user": "myname", "uuid": "1242315425","annotation":{"classifications":{"Niveau1":{"labels":[{"value":"AUTRE"}, {"value":"RC"}]}, "Niveau2": {"labels": [{"value":"RA06"}], "Niveau3": {"labels": [{"value":"RA06_01"}]}}}}
到目前为止,我所做的是在适当的结构中解析文件之后,使用以下函数
func convertoldAnnots[]AnnotV1新ANNOTS[]AnnotV2{
对于u,元素:=范围oldAnnots{
var newAnnot AnnotV2
newAnnot.User=element.User
newAnnot.Uuid=元素.Uuid
如果element.Data.Niveau1!=nil{
对于i,annot1:=范围元素.Data.Niveau1{
newAnnot.Annotation.Classif.Niveau1.Labels[i].Value=annot1
}
}
如果element.Data.Niveau2!=nil{
对于j,annot2:=范围元素.Data.Niveau2{
newAnnot.Annotation.Classif.Niveau2.Labels[j].Value=annot2
}
}
如果element.Data.Niveau3!=nil{
对于k,annot3:=范围元素.Data.Niveau3{
newAnnot.Annotation.Classif.Niveau3.Labels[k].Value=annot3
}
}
newAnnots=附录newAnnots,newAnnots
}
回来
}
但是,我得到的错误是索引[0]超出了我的切片的范围
死机:运行时错误:索引超出范围[0],长度为0
这两种结构的定义如下
类型AnnotV1 struct{
Uuid字符串`json:Uuid`
数据结构{
Niveau1[]字符串`json:Niveau1`
Niveau2[]字符串`json:Niveau2`
Niveau3[]字符串`json:Niveau3`
}`json:data`
用户字符串`json:User`
}
及
类型AnnotV2 struct{
Uuid字符串`json:Uuid`
注释结构{
Classif结构{
Niveau1结构{
标签[]结构{
值字符串`json:Value`
}`json:labels`
}
Niveau2结构{
标签[]结构{
值字符串`json:Value`
}`json:labels`
}
Niveau3结构{
标签[]结构{
值字符串`json:Value`
}`json:labels`
}
}`json:分类`
}`json:annotation`
用户字符串`json:User`
}
类型标签结构{
值字符串`json:Value`
}
类型AnnotV2 struct{
Uuid字符串`json:Uuid`
注释结构{
Classif结构{
Niveau1结构{
标签[]标签`json:Labels`
}
Niveau2结构{
标签[]标签`json:Labels`
}
Niveau3结构{
标签[]标签`json:Labels`
}
}`json:分类`
}`json:annotation`
用户字符串`json:User`
}
预先分配切片
如果element.Data.Niveau2!=零{
newAnnot.Annotation.Classif.Niveau2.Labels=make[]Label,lenelement.Data.Niveau2
对于j,annot2:=范围元素.Data.Niveau2{
newAnnot.Annotation.Classif.Niveau2.Labels[j].Value=annot2
}
}
或者使用append
如果element.Data.Niveau2!=零{
对于2,annot2:=范围元素.Data.Niveau2{
newAnnot.Annotation.Classif.Niveau2.Labels=appendnewAnnot.Annotation.Classif.Niveau2.Labels,标签{annot2}
}
}
那么,恐慌发生在哪一行代码上?runtme告诉你了。它还告诉你导致恐慌的整个呼叫链。你从这些信息中收集到了什么?嗯,我想我是通过if element.Data.NiveauX!=无在任何情况下,这都不会直接导致问题,因为错误已经存在于Niveau1中。如果我添加了annot1的打印,它将正确打印,但我无法执行分配newAnnot.Annotation.Classif.Niveau1.Labels[I].Value=annot1您需要将标签切片预分配到与旧Niveau切片相同的长度,以便能够索引到其中。或者您需要使用append。在这两种情况下,您可能都应该声明一个命名的标签类型,以便更轻松地执行此操作。请注意,检查切片是否存在!=nil可能还不够:一个声明s:=[]int{}生成一个非nil切片,其中零元素lens==0。谢谢。我已经这样做了,创建了另一个struct标签并制作了[]标签,lenNiveauX,但是我还是有错误,键入non-literal非常感谢!