将切片复制到反射数组

时间:2016-03-12 21:50:11

标签: reflection go struct

我有一个看起来像这样的结构:

type Record struct {
   Name         string
   QuestionType [2]byte // Array may be arbitrary length
   Class        [3]byte
}

我试图用bytes.Buffer中的字节填充结构(由于字节数据中的一些额外复杂性,我无法使用binary.Read。)我使用{{1} } package迭代结构的元素,并从bytes.Buffer读入结构。

reflect

但是,当我尝试用缓冲区中的n个字节填充[n]字节数组时,我发现自己无法将func fillStructure(buffer *bytes.Buffer) *Record { // This is hard-coded now, but will be passed in as an interface later myStruct := Record{} reflectedStruct := reflect.ValueOf(&myStruct).Elem() for i := 0; i < reflectedStruct.NumField(); i++ { field := reflectedStruct.Field(i) if field.Kind() == reflect.Array { // Copy bytes from buffer into structure } } return &myStruct } 返回的切片复制到结构中的数组中。

  • buffer.Next(n)无法正常工作,因为[]字节与[n]字节不兼容。
  • field.Set()无法正常工作,因为我无法找到获取结构数组的方法

问题:有没有办法获得切片&#34;查看&#34;反射结构的数组,所以我可以复制值?或者其他一些方法将缓冲区返回的切片复制到结构中?

1 个答案:

答案 0 :(得分:0)

copy确实有效,如果你“欺骗”数组认为它是一个切片。

copy(myStruct.QuestionType[:], buffer.Bytes())

在您的情况下,您可以将reflect.Copy与上述技术结合使用,如下所示:

if field.Kind() == reflect.Array {
    srcArr := [2]byte{}
    copy(srcArr[:], buffer.Bytes())
    reflect.Copy(field, reflect.ValueOf(srcArr))
}