我正在逐字段地从io.Reader
读到一个结构。
// structFields returns a sequence of reflect.Value
for field := range structFields {
switch field.Kind() {
case reflect.String:
// Omitted
case reflect.Uint8:
value := make([]byte, 2)
reader.Read(value)
var num uint8
err := binary.Read(bytes.NewBuffer(value[:]), binary.LittleEndian, &num)
if err != nil { return err }
field.SetUint(int64(num))
// Case statements for each of the other uint and int types omitted
}
}
不幸的是,需要为每个Uint和Int数据类型重复reflect.Uint8的块,因为我需要在每种情况下正确创建var num
。
有没有办法可以简化这个switch语句?
答案 0 :(得分:2)
而不是使用var num uint8
和field.SetUint(int64(num))
只需将结构字段的指针传递给binary.Read
:
ptr := field.Addr().Interface()
err := binary.Read(bytes.NewBuffer(value[:]), binary.LittleEndian, ptr)
并使案例陈述说:
case reflect.Uint8, reflect.Int, reflect.Uint, ...:
然后你需要处理不同大小的数字。幸运的是,您可以直接将您的读者传递给binary.Read
,它会照顾它:
err := binary.Read(reader, binary.LittleEndian, ptr)
最后,正如FUZxxl所说,您只需将指向整个结构的指针传递给binary.Read
,它就会为您完成所有这些。