当前位置: 首页 > 面试题库 >

功能表与golang中的switch

归星驰
2023-03-14
问题内容

我正在用go编写一个简单的模拟器(我应该还是应该回到c?)。无论如何,我正在获取指令并对其进行解码。在这一点上,我有一个字节,如0x81,我必须执行正确的功能。

我应该有这样的东西吗

func (sys *cpu) eval() {
    switch opcode {
    case 0x80:
        sys.add(sys.b)
    case 0x81:
        sys.add(sys.c)
    etc
    }
}

或类似的东西

var fnTable = []func(*cpu) {
    0x80: func(sys *cpu) {
        sys.add(sys.b)
    },
    0x81: func(sys *cpu) {
        sys.add(sys.c)
    }
}
func (sys *cpu) eval() {
    return fnTable[opcode](sys)
}

1.哪个更好?
2.哪个更快?
还可以
3.我可以内联声明一个函数吗?
4.我有一个cpu struct我有寄存器等的地方。如果我有寄存器并且全部作为全局变量会更快吗?(没有struct

非常感谢你。


问题答案:
  1. 第一个版本对我来说更好,YMMV。

  2. 进行基准测试。取决于编译器的优化能力。如果编译器没有尽力进行优化,则“跳转表”版本可能会更快。

  3. 取决于您对“内联声明函数”的定义。Go只能在顶层声明和定义函数/方法。但是函数是Go中的一等公民,因此可以具有变量/参数/返回值和函数类型的结构化类型。在所有这些地方,也可以将函数文字分配给变量/字段/元素…

  4. 可能吧 我仍然建议不要将cpu状态保持在全局变量中。一旦您可能决定去仿真多核,它将是受欢迎的;-)



 类似资料:
  • 问题内容: 基本上,如果我有任意函数的切片或数组,如何选择仅返回int的函数或仅选择采用int的函数? 我认为我需要使用反射包,但是仅仅阅读文档并不能真正帮助我准确地知道如何做。 问题答案: 该程序打印以a 为参数或返回a 的函数: 我认为代码是不言自明的

  • 问题内容: 从第13行开始阅读的源代码,我读到了一些这样的代码: 似乎没有身体。我试图将这些代码复制并粘贴到我的go文件中。它不会编译。错误消息是。所以我的问题是:Go语法中的无身体功能合法吗?谢谢。 问题答案: 这是在汇编中实现功能的方式。您可以在(例如AMD64)文件中找到程序集实现。 引用规范: 函数声明可以省略主体。这样的声明为Go外部实现的功能(例如汇编例程)提供了签名。

  • 我使用的是一个带有两列的datatable,其中有一个标签和一个selectOneMenu。 我需要动态显示selectOneMenu列表,我需要在bean中为其设置级别id。在commandbutton/commandLink中,我们可以在f:setPropertyActionListener的帮助下设置值。我只是想知道在使用selectonemenu时如何设置该值。任何帮助都将不胜感激。

  • 问题内容: 我的代码中有对象初始化程序,用于显式初始化对象的每个字段。但就我而言,大多数参数都有合理的默认值,我想使用它们。 在Python中,我通常使用关键字参数或默认值的组合,并且我的方法包含一些验证逻辑,因此我可以在对象初始化中使用零配置原则。例如: Go中没有默认值的参数,也没有关键字参数或函数重载。因此,很难编写灵活的初始化代码(通常我不太在意此类代码的性能)。我想找到最惯用的方式在Go

  • 问题内容: 我知道在模板中我可以调用以表达式命名的函数,例如。但是如何为表达式命名函数呢? 问题答案: 您总是可以定义这样的功能:

  • 问题内容: Go支持在函数内部嵌套结构,但除了lambda之外没有嵌套函数,这是否意味着无法在函数内部定义嵌套类? 因此,类在函数内部被削弱感到有点奇怪。 有什么提示吗? 问题答案: 实际上,无论您要声明 带有 接收器还是 不 带有接收器的函数都没有关系:不允许在Go中嵌套函数。 尽管您可以使用函数文字来实现以下目的: 在这里,我们创建了一个具有函数类型的变量,并将其分配给另一个函数。调用“外部”