使用反射将字节读入结构

我正在尝试编写使我能够将简单结构编组/解组为字节数组的函数。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()尾部的调用显然试图获取不可寻址值的地址。


如果有替代解决方案,我也将不胜感激。无论哪种方式,任何帮助将不胜感激。


HUWWW
浏览 188回答 3
3回答

慕田峪4524236

我认为你应该使用v&nbsp;:=&nbsp;p.Elem()&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;the&nbsp;value&nbsp;that&nbsp;'p'&nbsp;points&nbsp;to代替v&nbsp;:=&nbsp;reflect.ValueOf(p)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go