如何在不物理创建结构的情况下获取结构的 Reflect.Type 实例?

2023-12-01

我想创建一个结构类型注册表,以动态加载“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) 从指针(或切片、数组、通道或映射)获取其元素类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不物理创建结构的情况下获取结构的 Reflect.Type 实例? 的相关文章

随机推荐

  • php、文件下载

    我正在使用简单的文件下载脚本 if file exists file header Content Description File Transfer header Content Type application octet stream
  • R Shiny 保存反应性 ggplots

    我试图弄清楚如何在我的 R Shiny 项目中保存反应性 ggplots 我已经关注了this指南以及 R Shiny 网站上的指南 但是 我认为我可能遇到问题 因为我使用的是反应图 这是我到目前为止的代码 ui lt fluidPage
  • 如何将对象中数组的索引值添加到键

    我在变量中有一个对象info as 0 ProId Space Name cake Quantity 1 1 ProId new Name walk Quantity 1 我正在尝试将数量值更改为index 1对于每个索引 我尝试将静态值设
  • 如何使用 CASE 更新 MySQL 中的条目以获得新值?

    谁能告诉我如何解决这个查询 update ae44 set Price Case when ID AT259793380 then 500 when ID AT271729590 then 600 when ID AT275981020 t
  • 将数据变量传递给 R 公式

    假设我想写anscombe gt lm tidy x1 y1 其实我想写anscombe gt lm tidy x1 y1 where x1 and y1是数据框的一部分 因此 由于以下功能似乎有效 plot gg lt function
  • 如何将文本添加到按钮上方的 Inno Setup 斜线?

    如何将文本添加到按钮上方的 Inno Setup 斜线 来自 Inno Setup 帮助 特殊用途的 BeveledLabel 消息可用于指定一条线 向导窗口左下角显示的文本 和卸载程序窗口 下面是一个例子 Messages Beveled
  • 如何在 Swift 中使用命名空间?

    文档只提到了嵌套类型 但不清楚它们是否可以用作命名空间 我没有发现任何明确提及名称空间的内容 我认为 Swift 的命名空间是令人向往的 它的大量广告与实际情况不符 例如 WWDC 视频指出 如果您导入的框架有一个 MyClass 类 并且
  • Python Max/Min 函数中的 iter 和 key 如何工作? [复制]

    这个问题在这里已经有答案了 我对 Python 比较陌生 我一直在阅读各种内置函数的文档 当涉及到最大 最小函数时 max arg1 arg2 args key or max iterable key 我知道 arg1 arg2 等或 it
  • Jquery - 我不应该重复选择器(存储在变量中)吗?

    有时我发现自己多次重复选择器 我是否应该以某种方式将 jquery 对象存储到变量中 然后只使用该变量 举个简单的例子 以下内容怎么样 a contactus css padding 10px a contactus css margin
  • 我可以使用 lambda 重写 JDK8 中功能接口的 toString 方法吗?

    这个问题在这里已经有答案了 我可以重写功能接口的 toString 方法吗 或者改写一下 是否有优雅的方法来更改实现函数式接口并使用 lambda 重写 toString 方法的匿名内部类 当我在JDK8中创建lamba表达式时 我可以覆盖
  • python 对象到本机 c++ 指针

    我正在考虑使用 python 作为我正在从事的项目的嵌入式脚本语言 并且已经完成了大部分工作 但是我似乎无法将 python 扩展对象转换回本机 c 指针 这是我的课 class CGEGameModeBase public virtual
  • 寻找衍生脚本

    我正在拼命寻找可以计算函数一阶导数的 JavaScript 该函数始终仅包含一个变量 x e g f x x f 3 2x 因此 脚本应提供结果 6 因为2 3 6 我希望你明白我的意思 function slope f x dx dx d
  • .NET 在服务器上创建计划任务失败并显示 E_ACCESSDENIED

    我有一个 ASP NET 网站 C 语言 它接收用户数据 然后尝试创建 Windows 计划任务 当然 这在 DEV 机器上运行得很好 但在服务器上运行失败 我试图弄清楚 ASPNET 用户 或匿名 Web 用户 需要什么权限才能创建任务
  • 在 C++ 上解析 JSON 文件并获取主键的所有子文件[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我使用 boost 库 需要在 C 上解析一些 json 文件 对于前 json 部分 media Test1 https storage tst Test2 https sto
  • 在多列中查找字符串?

    我有一个包含 3 列 tel1 tel2 tel3 的数据框 我想保留一列或多列中包含特定值的行 例如 我想保留列 tel1 和 tel2 或 tel3 以 06 开头的行 我怎样才能做到这一点 谢谢 让我们用这个df作为示例数据框 In
  • 在量角器测试中修改 http 响应

    我正在尝试为应用程序的登录过程编写一些端到端测试 但我无法理解设置用户需要更改密码的场景的最佳方法 当我们的服务器响应成功登录时 会返回一个用户对象 其中包含changePassword场地 然后客户端检查响应并相应地重定向 我的问题是设置
  • 应用程序小部件未显示在 ICS 应用程序抽屉中

    有没有人经历过他们的应用程序小部件未列在 ICS 应用程序抽屉中 最初我为 FroYo 及以下版本启动了这个应用程序 它很好地支持应用程序小部件 随后出现了 Gingerbread 和 Honeycomb 它们也很有效 如果我打开 小部件预
  • 如何使用 readXML 读取 xml 属性? dataset.readxml如何转换为表格?

    我只是想知道 readXML 生成的表是什么样子的 假设 xml 文件看起来像这样
  • 程序收到信号 SIGSEGV:分段错误 - 大尺寸数组中的内存引用无效

    我在运行此代码时遇到错误 当我使用 L 16 或 L 32 等小 L 运行代码时 我没有得到任何错误 但在 7000 8000 步后 在 L 128 或 L 96 中 我得到以下错误 Program received signal SIGS
  • 如何在不物理创建结构的情况下获取结构的 Reflect.Type 实例?

    我想创建一个结构类型注册表 以动态加载 Project Euler 问题的解决方案 然而 我当前的解决方案要求首先创建结构并将其归零 然后才能注册其类型 package solution import errors fmt os refle