#### 初始化结构体
##### 目标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)
}
```
有问题请指出,谢谢。
有疑问加站长微信联系(非本文作者)