使用nil指针定义的类型反射创建一个新结构

时间:2014-12-05 13:01:52

标签: reflection go

我想知道是否可以使用nil

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

我该怎么做?

1 个答案:

答案 0 :(得分:10)

使用reflect.Type.Elem()

s := (*SomeType)(nil)
t := reflect.TypeOf(s).Elem()

v := reflect.New(t)
sp := (*SomeType)(unsafe.Pointer(v.Pointer()))
sp.A = 3

游乐场:http://play.golang.org/p/Qq8eo-W2yq

编辑:Elwinar在下面的评论中指出,您可以使用unsafe.Pointer获取没有reflect.Indirect()的结构:

s := (*SomeType)(nil)
t := reflect.TypeOf(s).Elem()

ss := reflect.Indirect(reflect.New(t)).Interface().(SomeType)
ss.A = 3

游乐场:http://play.golang.org/p/z5xgEMR_Vx