gpt4 book ai didi

go - 使用反射将字节读入结构

转载 作者:数据小太阳 更新时间:2023-10-29 03:17:57 26 4
gpt4 key购买 nike

我正在尝试编写允许我将简单结构编码/解码为字节数组的函数。在#go-nuts 的好心人的帮助下,我已经成功编写了 Marshal,但在编写 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() 的调用显然是在尝试获取不可寻址值的地址。

如果有替代解决方案,我也将不胜感激。无论哪种方式,我们都将不胜感激。

谢谢!

最佳答案

我认为你应该使用

v := p.Elem()   // Get the value that 'p' points to

代替

v := reflect.ValueOf(p)

关于go - 使用反射将字节读入结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9748196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com