在Go数组中查找的模式

时间:2014-03-23 22:04:31

标签: go

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
  }
}

是否有更简单/更常见的模式或库函数来执行此操作?

2 个答案:

答案 0 :(得分:3)

我认为没有任何特殊的内置语法可以在这里删除对边界检查的需要。一种选择是将代码包装在自定义类型中。例如:

type StringTable []string

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

您仍然可以使用与自定义类型相同的初始化语法:

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'

您可以在此处使用此示例:http://play.golang.org/p/nhti2dVE8B

答案 1 :(得分:0)

  

在某些情况下(键在已知且范围不太大的情况下)这是制作表格的有效方法,而不是地图

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

我们假设您知道所有密钥都在A-Z集中。因此,您创建一个包含26个条目的数组。当一个键进入时,你减去&#34; A&#34;的ASCII值。将索引放入表中。繁荣,恒定时间查找,这将比地图查找快得多。

请注意,您实际上并未将密钥存储在任何位置,而是隐含的。如果您要打印表格,则需要自己生成所有密钥(A-Z)。