如何解决bson go-HookDecoder,如何设置值
我正在寻找一种更改reflect.Value内容的方法。在下面的代码中(主要是DecodeValue方法),该值似乎表明它想要一个riff.Limitation项目。但是,限制是Time实现的接口,因此我想将value
指向的内存位置与实现该接口的实际结构交换。
该代码的主要目标是允许对我只有接口形式的元素进行序列化和反序列化。对于上下文:我要序列化的结构具有接口类型的多个片段,它们背后都有特定的实现。因此,我想将它们存储在具有以下结构的mongodb中:{ <type string>: {<keyA> : <keyB>,...}}
。到目前为止,我已经成功地以这种方式存储了它们。现在的目标是从数据库中获取它们并自己找出类型,然后在变量value
中插入正确类型的结构。
是否有一种方法可以到达value
所指向的存储位置,然后用我的(新)结构替换该存储位置的内容?
注册表制作:
timeType := reflect.TypeOf(limitations.Time{})
codec := limitations.NewLimitationCodec()
rb.RegisterCodec(timeType,codec)
t := reflect.TypeOf((*tariff.Limitation)(nil)).Elem()
rb.RegisterHookDecoder(t,codec)
LimitationCodec.DecodeValue
func (l LimitationCodec) DecodeValue(context bsoncodec.DecodeContext,reader bsonrw.ValueReader,value reflect.Value) error {
logrus.Infoln("In LimitationCodec - Decode")
documentReader,err := reader.ReadDocument()
key,valueReader,err := documentReader.ReadElement()
logrus.Infoln(key)
logrus.Infoln(valueReader)
v := Time{}
z := reflect.ValueOf(&v)
err = l.codec.DecodeValue(context,z)
// The above line seems to be able to read my struct without a problem
p := value.Addr()
p.Set(z)
// I only need to set the values in v to whatever memory position value is pointing to
return err
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。