如何在不物理创建结构的情况下获得结构的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实例?的主要内容,如果未能解决你的问题,请参考以下文章

hbase - 如何在不删除表的情况下更改表结构

如何在不使用复制或克隆的情况下克隆Rust中的结构?

如何在不复制数据的情况下创建 Oracle 表的副本?

有没有办法在不创建***结构的情况下将 JSON 解码为结构

为啥c ++ std::hash会创建一个仿函数结构并且可以在不每次创建结构的情况下调用它

如何在不知道名称的情况下访问结构成员?