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

yag*_*eek 8 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
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

Ain*_*r-G 11

用途reflect.Type.Elem():

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

v := reflect.New(t)
sp := (*SomeType)(unsafe.Pointer(v.Pointer()))
sp.A = 3
Run Code Online (Sandbox Code Playgroud)

游乐场: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
Run Code Online (Sandbox Code Playgroud)

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

  • 为了防止必须使用`unsafe`包,你应该使用`reflect.Indirect`方法.单行:`reflect.Indirect(reflect.New(reflect.TypeOf(sometype).Elem())).Interface().(SomeType)` (4认同)