代码之家  ›  专栏  ›  技术社区  ›  strobot

在Go中查找表?

  •  5
  • strobot  · 技术社区  · 10 年前

    这是在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];
    

    }

    1 回复  |  直到 10 年前
        1
  •  2
  •   Ben Echols    10 年前

    如果你愿意,你可以使用一个平面切片,那么你只需要为没有条目的条目设置空/0。如果您的非连续值可以达到非常高的值,那么这种方法将是不好的。

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

    在切片和映射上运行100000000个索引后,我得到了以下结果: 映射:3062毫秒切片:56毫秒

    也就是说,在几乎任何真实世界的使用情况下,速度差异都不重要。我会亲自使用地图。

    编辑:我同意另一条评论,即在函数外部初始化映射,这样它只需要构造一次,而不是每次调用。