Go使用反射初始化对象

delaywu · · 978 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

#### 初始化结构体 ##### 目标1 下面定义了 **UserClass**结构体,目的在实例化 **UserClass** 结构体能动态将 ***Person** 赋值 ```go type UserClass struct { *Person } func NewUserClass() *UserClass { return &UserClass{} } type Person struct { UserId int UserName string } func NewPerson() *Person { return &Person{UserId: 1001, UserName: "wuyue"} } ``` 实现方式 ``` func main() { var user = NewUserClass() fmt.Println(user) refVal := reflect.ValueOf(user).Elem() if refVal.NumField() > 0 { refVal.Field(0).Set(reflect.New(refVal.Field(0).Type().Elem())) //初始化对象 *Person 对象 refVal.Field(0).Elem().Set(reflect.ValueOf(NewPerson()).Elem()) } fmt.Println(user.Person) } ``` ##### 目标2 只对 ***Person** 对象赋值 这时候我仿照 **目标1**的写法 ``` func main() { var p *Person val := reflect.ValueOf(p) val.Set(reflect.New(val.Type().Elem())) // 有问题 val.Elem().Set(reflect.ValueOf(NewPerson()).Elem()) fmt.Println(val) } ``` 这时候会出现异常 ``` panic: reflect: reflect.Value.Set using unaddressable value ``` 思考:为何同样都是给指针变量赋值,2种情况(指针变量在结构体中和未初始化的指针变量)却是一个可以一个出错。 第一种情况下实际在初始化**UserClass**结构体时已经分配了地址。 第二种情况未分配地址。造成无法给 未初始化的(没有地址的变量)Set值。 解决: ```go func main() { var p *Person val := reflect.ValueOf(p) val=reflect.New(val.Type().Elem()) val.Elem().Set(reflect.ValueOf(NewPerson()).Elem()) fmt.Println(val) } ``` 有问题请指出,谢谢。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

978 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传