Go 使用切片时索引超出范围

Go 使用切片时索引超出范围,go,range,slice,indexoutofboundsexception,Go,Range,Slice,Indexoutofboundsexception,我正在尝试将旧版本jsonline转换为具有不同结构的新版本 现在,旧文件具有以下结构 {"user": "myname", "uuid": "1242315425", "data": {"Niveau1": ["AUTRE", "RC"], "Niveau2": ["RA06"], "N

我正在尝试将旧版本jsonline转换为具有不同结构的新版本

现在,旧文件具有以下结构

{"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非常感谢!