【问题标题】:Lookup tables in Go?在 Go 中查找表?
【发布时间】:2014-03-17 18:39:37
【问题描述】:

这是在 Go 中实现查找表的合适方法吗?有没有更好的方法?如果条目碰巧是不连续的,我希望它能够工作。

func LookupRpMax(val uint8) float64 {
    rpMaxRegisters := map[uint8]float64 {
        0x00 : 3926991,
        0x01 : 3141593,
        0x02 : 2243995,
        0x03 : 1745329,
        0x04 : 1308997,
        0x05 : 981748,
        0x06 : 747998,
        0x07 : 581776,
        0x08 : 436332,
        0x09 : 349066,
        0x0A : 249333,
        0x0B : 193926,
        0x0C : 145444,
        0x0D : 109083,
        0x0E : 83111,
        0x0F : 64642,
        0x10 : 48481,
        0x11 : 38785,
        0x12 : 27704,
        0x13 : 21547,
        0x14 : 16160,
        0x15 : 12120,
        0x16 : 9235,
        0x17 : 7182,
        0x18 : 5387,
        0x19 : 4309,
        0x1A : 3078,
        0x1B : 2394,
        0x1C : 1796,
        0x1D : 1347,
        0x1E : 1026,
        0x1F : 798,
    }
    return rpMaxRegisters[val];

}

【问题讨论】:

  • 至少在函数外声明并赋值rpMaxRegisters
  • 如果您熟悉 Assembler,您总是可以比较 go tool 6g -S 在不同情况下的输出。在您当前的实现中,每次执行 LookupRpMax 时,Go 都会 CALL ,runtime.makemap+0(SB)
  • 我在函数外部声明和分配地图时遇到问题。 var m map[uint8]float64 = {0x00 : 32, 0x04 : 2,} 导致 syntax error: unexpected { 错误
  • 你应该使用var m = map[uint8]float{...},示例如下:play.golang.org/p/3ows0DCBXd
  • 谢谢,这是有道理的。我对 Go 声明和初始化的工作方式感到困惑。我同意在函数之外声明它。我假设这个声明将使我们正在编写的 Go 包本地化地图?

标签: go lookup lookup-tables


【解决方案1】:

如果您愿意,您可以使用平面切片 - 那么对于没有条目的条目,您只需使用 null/0。如果您的非连续值可以达到非常高的值,那么这种方法会很糟糕。

使用此代码:http://play.golang.org/p/gLni-BzMKy

在切片和地图上运行 100,000,000 个索引后,我得到了这些结果: 地图:3062 毫秒切片:56 毫秒

话虽如此 - 速度差异几乎在任何现实世界的用例中都无关紧要。我会亲自使用地图。

编辑:我同意另一条评论,即在函数外部初始化地图,因此只需构造一次,而不是每次调用。

【讨论】:

  • 谢谢,这是信息。我假设如果在函数内部,则无法在映射声明中使用 C 关键字“static”之类的东西?
  • 编辑:地图不能是常量。只有像 float、int、string 等基元。请参阅:golang.org/ref/spec#Constants
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 2021-12-08
  • 2013-12-08
  • 1970-01-01
相关资源
最近更新 更多