Go有方便的语法来定义数组查找表:
var myTable = [...]string{
'a': "aaaa",
'b': "bbbb",
'z': "zoro",
}在某些情况下(键在已知的范围内,并且不是太大的范围),这是比map更有效的制表方式。但是,很容易在map中查找并查找键是否不在其中。但是要在这个数组中按索引查找,我必须这样做:
if index < len(myTable) {
if val := myTable[index]; val != "" {
// here I know index exists in array and val is its value
}
}有没有更简单/更常见的模式或库函数来做这件事?
发布于 2014-03-24 14:50:17
我不认为这里有任何特殊的内置语法来消除对边界检查的需要。一种选择是将代码包装在自定义类型中。例如:
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
发布于 2014-03-24 11:42:27
在某些情况下(键在已知的范围内,并且不是太大的范围),这是比映射更有效的制表方式
是。您希望将键转换为数组中的偏移量。然后,您可以在固定时间内进行查找。
假设您知道所有的关键点都将位于set A-Z中。因此,您创建了一个包含26个条目的数组。当一个键进入时,减去"A“的ASCII值就可以得到表中的索引。突然,恒定时间的查找,这将比地图查找快得多。
请注意,您实际上并没有将密钥存储在任何地方,它是隐式的。如果想要打印表,则需要自己生成所有键(A-Z)。
https://stackoverflow.com/questions/22597735
复制相似问题