为了账号安全,请及时绑定邮箱和手机立即绑定

将切片复制到反射数组中

将切片复制到反射数组中

Go
慕尼黑5688855 2021-12-20 17:06:06
我有一个看起来像这样的结构: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() 不起作用,因为我找不到获取结构数组切片的方法问题:有没有办法获得反射结构数组的切片“视图”,以便我可以复制值?或者通过其他方式将缓冲区返回的切片复制到结构中?
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

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))

}


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信