我正在尝试编写使我能够将简单结构编组/解组为字节数组的函数。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()尾部的调用显然试图获取不可寻址值的地址。
如果有替代解决方案,我也将不胜感激。无论哪种方式,任何帮助将不胜感激。
慕田峪4524236
相关分类