在 Go 中查找表?

str*_*bot 5 lookup lookup-tables go

这是在 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];
Run Code Online (Sandbox Code Playgroud)

}

Ben*_*ols 2

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

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

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

话虽如此,在几乎任何现实世界的用例中,速度差异都不重要。我个人只会使用地图。

编辑:我同意其他评论,即在函数外部初始化映射,因此只需构造一次,而不是在每次调用时构造一次。