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
}
}
是否有更简单/更常见的模式或库函数来执行此操作?
答案 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
)。