Я пытаюсь написать функции, которые позволят мне маршалировать / демаршировать простые структуры в байтовые массивы.Мне удалось написать 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()
ближе к концу, по-видимому, пытается получить адрес с неадресуемым значением.
Если есть альтернативное решение, я также был бы признателен за это.В любом случае, любая помощь будет высоко ценится.
Спасибо!