猿问

将切片复制到反射数组中

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


type Record struct {

   Name         string

   QuestionType [2]byte // Array may be arbitrary length

   Class        [3]byte

}

我试图用来自 a 的字节填充结构bytes.Buffer(由于字节数据的一些额外的复杂性,我无法使用 binary.Read。)我正在使用reflect包来迭代结构的元素,并从bytes.Buffer 进入结构。


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

}

但是,当我尝试用缓冲区中的 n 个字节填充 [n] 字节数组时,我发现自己无法将返回的切片复制buffer.Next(n)到结构中的数组中。


field.Set() 不起作用,因为 []byte 与 [n]byte 不兼容。

copy() 不起作用,因为我找不到获取结构数组切片的方法

问题:有没有办法获得反射结构数组的切片“视图”,以便我可以复制值?或者通过其他方式将缓冲区返回的切片复制到结构中?


慕尼黑5688855
浏览 115回答 1
1回答

沧海一幻觉

copy 如果您“欺骗”数组使其认为它是一个切片,则确实有效。copy(myStruct.QuestionType[:], buffer.Bytes())在您的情况下,您可以reflect.Copy与上述技术一起使用,如下所示:if field.Kind() == reflect.Array {&nbsp; &nbsp; srcArr := [2]byte{}&nbsp; &nbsp; copy(srcArr[:], buffer.Bytes())&nbsp; &nbsp; reflect.Copy(field, reflect.ValueOf(srcArr))}
随时随地看视频慕课网APP

相关分类

Go
我要回答