reflect.New().Interface()をNonPointerなstructに変換する

reflect.New()を使うとドキュメントにもある通りPointerの値が返ってくる

New returns a Value representing a pointer to a new zero value for the specified type. That is, the returned Value’s Type is PtrTo(typ).

ただし、pointerではない元の情報を取得したいときがある

そんな時はこんな感じで取得できる

v := reflect.New(t).Interface()
if t.Kind() != reflect.Ptr {
  v = reflect.ValueOf(v).Elem().Interface()
}

サンプルコード

reflect.New() に渡るtが既にPointerの場合 reflect.New(t).Interface()ではPointerのPointerが返ってくるので注意が必要

おまけ

reflectに関してはみんなのGoの第5章がとても参考になった