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

使用反射将字节读入结构

使用反射将字节读入结构

Go
HUWWW 2021-04-25 15:08:27
我正在尝试编写使我能够将简单结构编组/解组为字节数组的函数。Marshal在#go-nuts的好心人的帮助下,我已经成功地写作,但是我在写作方面遇到了麻烦Unmarshal。// Unmarshal unpacks the binary data and stores it in the packet using// reflection.func Unmarshal(b []byte, t reflect.Type) (pkt interface{}, err error) {    buf := bytes.NewBuffer(b)    p := reflect.New(t)    v := reflect.ValueOf(p)    for i := 0; i < t.NumField(); i++ {        f := v.Field(i)        switch f.Kind() {        case reflect.String:            // length of string            var l int16            var e error            e = binary.Read(buf, binary.BigEndian, &l)            if e != nil {                err = e                return            }            // read length-of-string bytes from the buffer            raw := make([]byte, l)            _, e = buf.Read(raw)            if e != nil {                err = e                return            }            // convert the bytes to a string            f.SetString(bytes.NewBuffer(raw).String())        default:            e := binary.Read(buf, binary.BigEndian, f.Addr())            if e != nil {                err = e                return            }        }    }    pkt = p    return}上面代码的问题是,对f.Addr()尾部的调用显然试图获取不可寻址值的地址。如果有替代解决方案,我也将不胜感激。无论哪种方式,任何帮助将不胜感激。
查看完整描述

3 回答

?
慕田峪4524236

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

我认为你应该使用

v := p.Elem()   // Get the value that 'p' points to

代替

v := reflect.ValueOf(p)


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

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