我想创建一个结构类型的注册表,以便动态加载“欧拉项目”问题的解决方案。但是,我当前的解决方案要求首先创建结构并将其归零,然后才能注册其类型:
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 和其他解决方案的类型而无需事先创建结构实例?
海绵宝宝撒
相关分类