在golang中,如何在没有物理创建结构的情况下获得结构的reflect.Type实例?

时间:2016-02-02 23:12:53

标签: optimization reflection go

我想创建一个结构类型的注册表,以便动态加载解决方案到项目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结构的类型'在Init()函数内注册。这个结构有目的地荒谬地说明了这个问题。

有没有办法可以访问DummySolution和其他解决方案的类型而无需事先创建结构实例?

1 个答案:

答案 0 :(得分:4)

您可以使用reflect.TypeOf((*DummySolution)(nil)).Elem()。使nil指针不为整个结构分配空间,而Elem(在reflect.Type的定义下描述)可以从指针(或切片,数组,通道)获取或者映射)到它的元素类型。