我正在嘗試編寫函數,使我可以將簡單結構編組/解組爲字節數組。我已經成功寫作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()
顯然是想獲得一個不可尋址的地址值。
如果有其他解決方案,我也會很感激。無論哪種方式,任何幫助將不勝感激。
謝謝!
您能否提供樣本數據和結構以便我們可以測試您的代碼? – Mostafa 2012-03-17 08:50:04
更多信息真的有幫助。編組數據的格式是什麼,結構是什麼樣的? (如果結構類型是固定的,則根本不需要反射。)如果結構類型可以變化,那麼您編寫的代碼仍然取決於它們如何變化。例如,如果struct字段類型對於給定的數據字段可能會有所不同,則必須進行一些轉換。如果struct字段與數據字段不完全一致,則必須有某種方式將它們匹配起來。 – Sonia 2012-03-17 23:24:20