我正在尝试编写使我能够将简单结构编组/解组为字节数组的函数。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)
- 3 回答
- 0 关注
- 187 浏览
添加回答
举报
0/150
提交
取消