我有一个看起来像这样的结构:
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;反射结构的数组,所以我可以复制值?或者其他一些方法将缓冲区返回的切片复制到结构中?
答案 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))
}