英文:
Create a new struct with reflect from type defined by a nil pointer
问题
我可以帮你翻译代码部分,以下是翻译好的内容:
我想知道是否可以通过使用reflect.New()
从由nil
指针指定的类型中分配一个结构体。
type SomeType struct{
A int
}
sometype := (*SomeType)(nil)
v := reflect.valueOf(sometype)
// 我想根据指针定义的类型分配一个新的结构体
// newA := reflect.New(...)
//
newA.A = 3
我应该如何做到这一点?
英文:
I would like know if it is possible to allocate a struct from a type specified by a nil
pointer by using reflect.New()
type SomeType struct{
A int
}
sometype := (*SomeType)(nil)
v := reflect.valueOf(sometype)
// I would like to allocate a new struct based on the type defined by the pointer
// newA := reflect.New(...)
//
newA.A = 3
How should I do this ?
答案1
得分: 12
s := (*SomeType)(nil)
t := reflect.TypeOf(s).Elem()
v := reflect.New(t)
sp := (*SomeType)(unsafe.Pointer(v.Pointer()))
sp.A = 3
Playground: http://play.golang.org/p/Qq8eo-W2yq
编辑:下面的评论中,Elwinar 指出可以使用 reflect.Indirect()
来获取结构体,而不需要使用 unsafe.Pointer
:
s := (*SomeType)(nil)
t := reflect.TypeOf(s).Elem()
ss := reflect.Indirect(reflect.New(t)).Interface().(SomeType)
ss.A = 3
Playground: http://play.golang.org/p/z5xgEMR_Vx
英文:
Use reflect.Type.Elem()
:
s := (*SomeType)(nil)
t := reflect.TypeOf(s).Elem()
v := reflect.New(t)
sp := (*SomeType)(unsafe.Pointer(v.Pointer()))
sp.A = 3
Playground: http://play.golang.org/p/Qq8eo-W2yq
EDIT: Elwinar in comments below pointed out that you can get the struct without unsafe.Pointer
by using reflect.Indirect()
:
s := (*SomeType)(nil)
t := reflect.TypeOf(s).Elem()
ss := reflect.Indirect(reflect.New(t)).Interface().(SomeType)
ss.A = 3
Playground: http://play.golang.org/p/z5xgEMR_Vx
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论