golang reflect new 和 newAt 区别
时间: 2023-12-04 16:24:52 浏览: 30
在 Go 语言中,reflect 包提供了 New 和 NewAt 两个函数,它们都可以用来创建一个指定类型的新对象,但是它们的使用场景是略有区别的。
reflect.New 函数的作用是创建一个指定类型的实例,并且返回一个指向该实例的指针。这个指针的类型是 *reflect.Value。可以使用 reflect.Value.Elem() 方法获取到这个实例。
假设我们有一个结构体类型 Student:
```
type Student struct {
Name string
Age int
Gender string
}
```
那么使用 reflect.New 函数创建一个 Student 类型的实例可以这样写:
```
s := reflect.New(reflect.TypeOf(Student{})).Elem()
```
这里,reflect.TypeOf(Student{}) 返回的是一个 reflect.Type 类型的值,它表示 Student 类型。然后我们调用 reflect.New 方法,传入这个类型的值,就可以创建一个新的实例。最后使用 Elem() 方法获取到这个实例。
而 reflect.NewAt 函数的作用是在指定的地址上创建一个指定类型的实例,并且返回一个指向该实例的指针。这个指针的类型是 *reflect.Value。
假设我们已经有一个指向 Student 类型的指针 p,那么使用 reflect.NewAt 函数创建一个 Student 类型的实例可以这样写:
```
s := reflect.NewAt(reflect.TypeOf(Student{}), unsafe.Pointer(p)).Elem()
```
这里,我们传入了 Student 类型的 reflect.Type 值,以及一个 unsafe.Pointer 类型的指针 p。unsafe.Pointer 是一个不安全的指针类型,它可以指向任何地址。reflect.NewAt 方法会在 p 指向的地址上创建一个新的 Student 类型的实例,并且返回一个指向该实例的指针。最后使用 Elem() 方法获取到这个实例。
总之,reflect.New 和 reflect.NewAt 都可以用来创建一个指定类型的新对象,但是 reflect.New 适用于只需要创建一个新对象的场景,而 reflect.NewAt 适用于需要在指定地址上创建新对象的场景。注意使用 reflect 包时要特别小心,以避免出现安全问题。