go 利用反射获取指针指向的结构体
时间: 2023-12-06 15:04:56 浏览: 32
在 Go 语言中,可以使用反射的方式获取指针指向的结构体。示例代码如下:
```go
package main
import (
"reflect"
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
// 创建结构体实例的指针
p := &Person{
Name: "Alice",
Age: 18,
}
// 获取指针指向的结构体类型
t := reflect.TypeOf(*p)
// 创建结构体实例
s := reflect.New(t).Elem().Interface()
// 将指针指向的结构体的值拷贝到新创建的结构体实例中
reflect.ValueOf(s).Elem().Set(reflect.ValueOf(*p))
// 输出结构体字段值
fmt.Println(s.(Person).Name)
fmt.Println(s.(Person).Age)
}
```
在上面的代码中,我们首先创建了一个指向 `Person` 结构体的指针 `p`,然后使用反射的方式获取指针指向的结构体类型,并创建新的结构体实例。接着,我们使用 `reflect.ValueOf` 获取指针指向的结构体的值,并将其拷贝到新创建的结构体实例中。最后可以通过新创建的结构体实例访问结构体的字段值。
相关问题
go 反射利用指针创建结构体
可以通过反射的方式,利用指针创建结构体。具体步骤如下:
1. 定义一个类型变量 `t`,表示要创建的结构体类型。
2. 使用 `reflect.New()` 方法创建一个指向该类型的指针对象 `ptr`。
3. 调用 `ptr.Elem()` 方法获取指针指向的结构体对象 `val`。
4. 使用 `val.FieldByName()` 方法设置结构体中的字段值。
下面是一个示例代码:
```go
import (
"reflect"
)
type Person struct {
Name string
Age int
}
func main() {
t := reflect.TypeOf(Person{})
ptr := reflect.New(t)
val := ptr.Elem()
nameField := val.FieldByName("Name")
ageField := val.FieldByName("Age")
nameField.SetString("John")
ageField.SetInt(30)
p := ptr.Interface().(*Person)
fmt.Println(p.Name, p.Age)
}
```
在以上代码中,我们首先定义了一个 `Person` 结构体。然后,我们使用反射的方式创建了一个指向 `Person` 结构体的指针对象 `ptr`,并获取了其指向的结构体对象 `val`。接着,我们使用 `val.FieldByName()` 方法获取了 `Name` 和 `Age` 两个字段,并设置了它们的值。最后,我们将 `ptr` 转换成 `*Person` 类型的对象 `p`,并打印了 `p` 中的字段值。
go 反射利用空指针创建结构体
在 Go 语言中,我们可以使用反射来利用空指针创建结构体。具体实现方法如下:
首先,我们需要获取结构体的类型信息,比如:
```
type Person struct {
Name string
Age int
}
personType := reflect.TypeOf(Person{})
```
接着,我们可以使用 reflect.New() 函数创建一个指向该结构体类型的指针变量,比如:
```
personPtr := reflect.New(personType)
```
此时,personPtr 是一个空指针,它并没有指向任何一个有效的结构体实例。
接下来,我们可以使用 reflect.Indirect() 函数获取 personPtr 指针变量所指向的结构体实例,并设置其字段值,比如:
```
person := personPtr.Elem()
person.FieldByName("Name").SetString("张三")
person.FieldByName("Age").SetInt(18)
```
此时,person 就指向了一个新的 Person 结构体实例,它的 Name 是 "张三",Age 是 18。
需要注意的是,使用反射创建结构体实例时,我们需要先通过 reflect.New() 函数创建一个指向该结构体类型的指针变量,然后再使用 reflect.Indirect() 函数获取其所指向的结构体实例。