如何在不物理创建结构的情况下获得结构的reflect.Type实例?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不物理创建结构的情况下获得结构的reflect.Type实例?相关的知识,希望对你有一定的参考价值。
我想创建结构类型的注册表,以动态加载解决方案来解决'Project Euler'问题。但是,我当前的解决方案要求先创建该结构并将其清零,然后才能注册其类型:
package solution
import (
"errors"
"fmt"
"os"
"reflect"
)
type Solution interface
Load()
Solve() string
type SolutionRegister map[string]reflect.Type
func (sr SolutionRegister) Set(t reflect.Type)
fmt.Printf("Registering %s\n", t.Name())
sr[t.Name()] = t
func (sr SolutionRegister) Get(name string) (Solution, error)
if typ, ok := sr[name]; ok
sol := reflect.New(typ).Interface().(Solution)
return sol, nil
return nil, errors.New("Invalid solution: " + name)
var solutionsRegistry = make(SolutionRegister)
func Register(sol Solution)
solutionsRegistry.Set(reflect.TypeOf(sol).Elem())
func Load(s string) Solution
sol, err := solutionsRegistry.Get(s)
if err != nil
fmt.Printf("Error loading solution %s (%s)\n", s, err)
os.Exit(-1)
sol.Load()
return sol
type DummySolution struct
data [100 * 1024 * 1024 * 1024]uint8
func (s *DummySolution) Load()
func (s *DummySolution) Solve() string
return ""
func Init()
Register(&DummySolution)
在此示例中,'DummySolution struct'的类型已在Init()函数中注册。为了说明这个问题,此结构故意过大而荒唐。
是否有一种方法可以访问DummySolution和其他解决方案的类型,而无需事先创建该结构的实例?
答案
您可以使用reflect.TypeOf((*DummySolution)(nil)).Elem()
。制作nil
指针不会为整个结构分配空间,Elem
(在reflect.Type
的定义下进行了描述)使您从指针(或切片,数组,通道或映射)转到其元素类型。
以上是关于如何在不物理创建结构的情况下获得结构的reflect.Type实例?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在不创建***结构的情况下将 JSON 解码为结构