GoLang:读取并将字节转换为struct字段

时间:2014-07-22 21:37:31

标签: reflection file-io go

我正在逐字段地从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语句?

1 个答案:

答案 0 :(得分:2)

而不是使用var num uint8field.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,它就会为您完成所有这些。