我想创建一个结构类型的注册表,以便动态加载解决方案到项目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和其他解决方案的类型而无需事先创建结构实例?
答案 0 :(得分:4)
您可以使用reflect.TypeOf((*DummySolution)(nil)).Elem()
。使nil
指针不为整个结构分配空间,而Elem
(在reflect.Type
的定义下描述)可以从指针(或切片,数组,通道)获取或者映射)到它的元素类型。