Go数组中的查找模式

Go数组中的查找模式,go,Go,Go具有方便的语法来定义数组查找表: var myTable = [...]string{ 'a': "aaaa", 'b': "bbbb", 'z': "zoro", } 在某些情况下(键在已知范围内且范围不太大),这是一种比映射更有效的制表方法。然而,在地图中进行查找并查找不在地图中的键是很容易的。但要在此数组中按索引进行查找,我必须执行以下操作: if index < len(myTable) { if val := myTable[index]; val != "

Go具有方便的语法来定义数组查找表:

var myTable = [...]string{
  'a': "aaaa",
  'b': "bbbb",
  'z': "zoro",
}
在某些情况下(键在已知范围内且范围不太大),这是一种比映射更有效的制表方法。然而,在地图中进行查找并查找不在地图中的键是很容易的。但要在此数组中按索引进行查找,我必须执行以下操作:

if index < len(myTable) {
  if val := myTable[index]; val != "" {
    // here I know index exists in array and val is its value
  }
}
if索引
是否有更简单/更常见的模式或库函数来执行此操作

在某些情况下(键在已知范围内且范围不太大),这是比映射更有效的制表方法

对。您希望将关键点转换为数组中的偏移量。然后您可以在固定时间内进行查找

假设您知道所有钥匙都将在集合
A-Z
中。因此,您创建了一个包含26个条目的数组。当输入一个键时,减去ASCII值“a”,将索引放入表中。Boom,恒定时间查找,这将比地图查找快得多


请注意,实际上并没有将密钥存储在任何位置,它是隐式的。如果你想打印出你的表,你需要自己生成所有的键(
A-Z
)。

我不认为这里有任何特殊的内置语法来消除边界检查的需要。一个选项是将代码包装为自定义类型。例如:

type StringTable []string

func (st StringTable) Get(i int) string {
    if i < 0 || i >= len(st) {
        return ""
    }
    return st[i]
}

您可以在这里使用这个示例:

也许可以在带有getter和setter的结构/接口中包装
myTable
,并使用
myTable
slice
来操作它。然后你的setter方法可以删除一个空的条目,你就不用担心它了。就OOP而言,这将是一个合适的设计。但是在这种情况下,
map
会更容易/更有效。但这根本不能回答问题。谢谢,我很清楚为什么数组查找比map快,这在questionoops中有明确说明,误读了这个问题。同意前面的答案,没有任何捷径,只需在数组上创建一个函数。谢谢,这是一个有趣的选项。我在想,因为缺少泛型,我必须对每个表类型都这样做,但将其设置为自定义类型的想法非常酷,因为在Go中,我可以定义任何类型的方法。顺便说一句,您的示例遗漏了StringTable的typedef,我在将其复制到答案中时一定遗漏了它。现在修好了。
myTable := StringTable{
    'a': "aaaa",
    'b': "bbbb",
    'z': "zoro",
}
fmt.Printf("%#v\n", myTable.Get('a'))
fmt.Printf("%#v\n", myTable.Get(-5))
fmt.Printf("%#v\n", myTable.Get('~')) // greater than 'z'