reflect.new 是 go 反射中创建可修改实例的核心方法,它接收 reflect.type 并返回指向该类型零值的指针 reflect.value,相当于运行时调用 new(t),可用于动态构造对象;其返回值为指针类型,需通过 .elem() 获取可寻址的结构体值以修改字段,且字段必须可导出并满足 canset() 条件;相比 reflect.zero(返回不可修改的零值)和 &struct{}(非反射方式),reflect.new 唯一支持反射中可修改的实例创建;常用于工厂模式、orm、依赖注入等场景,例如通过 reflect.new(typ).elem().interface() 返回值类型实例或直接返回指针,使用时需确保传入非 nil 的有效类型,最终完整实现动态对象创建与字段赋值。

在 Go 语言中,使用反射(
reflect
reflect.New
new(T)
下面详细说明如何使用
reflect.New
reflect.New
reflect.New(typ)
reflect.Type
reflect.Value
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func main() {
// 获取类型
t := reflect.TypeOf(Person{})
// 使用 reflect.New 创建新实例(指针)
newPtr := reflect.New(t)
// newPtr 是 reflect.Value,其值是一个 *Person 类型的指针
fmt.Println(newPtr.Type()) // *main.Person
fmt.Println(newPtr.Elem()) // { 0},指向的零值
// 转成接口获取真实对象
instance := newPtr.Interface() // 返回 interface{},实际是 *Person
fmt.Printf("%#v\n", instance) // &main.Person{Name:"", Age:0}
}✅ 注意:reflect.New 返回的是指针类型(*T),如果需要操作结构体字段,需要用 .Elem() 获取指针指向的值。
由于
reflect.New
.Elem()
newPtr := reflect.New(t) // *Person
newValue := newPtr.Elem() // Person(可寻址)
// 设置字段
nameField := newValue.FieldByName("Name")
if nameField.CanSet() {
nameField.SetString("Alice")
}
ageField := newValue.FieldByName("Age")
if ageField.CanSet() {
ageField.SetInt(25)
}
// 查看结果
fmt.Println(newValue.Interface()) // {Alice 25}reflect.Zero
&struct{}| 方法 | 说明 |
|---|---|
| @@######@@ | 分配内存,返回 @@######@@ 类型的 @@######@@,指向零值,可修改 |
| @@######@@ | 返回 @@######@@ 类型的零值 @@######@@,但不可修改(只读) |
| @@######@@ | 普通方式创建指针实例,非反射 |
所以,只有 reflect.New(t)
*T
或者返回指针:
reflect.Value
reflect.Zero(t)
T
reflect.Value
&T{}reflect.New
func CreateInstance(typ reflect.Type) interface{} {
return reflect.New(typ).Elem().Interface()
}
// 使用
p := CreateInstance(reflect.TypeOf(Person{})).(Person)
fmt.Printf("%#v\n", p) // main.Person{Name:"", Age:0}func CreateInstancePtr(typ reflect.Type) interface{} {
return reflect.New(typ).Interface() // 返回 *T
}reflect.New
reflect.Type
nil
基本上就这些。
reflect.Value
.Elem()
CanSet()
reflect.New(int)
*int
.Elem()
int
reflect.New
new(T)
以上就是Golang反射创建新实例怎么做 使用reflect.New分配内存的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号