我试图实施玩具搜索算法并需要维护一组探索状态。状态是结构:
type VWState struct {
botLocation VWCoords
dirtLocations []VWCoords
}
我的第一个想法是,可以使用map[VWState]bool
实现一个简单的Set,但我似乎无法找到一种方法来使其工作。如果我尝试使用VWState
作为地图的关键字,我会遇到以下恐慌:
Panic: runtime error: hash of unhashable type vw.VWState (PC=0x40EB0D)
有没有办法让这项工作?我可以为结构实现自定义散列函数,还是应该考虑其他一些实现方法?
非常感谢任何帮助。
答案 0 :(得分:3)
您可以使用指向结构的指针作为地图键:
map[*VWState]bool
如果您希望能够比较等效结构,可以创建一个方法来输出地图的关键字。 String()
会很方便,因为您也可以使用它来打印结构,或者使用哈希函数并输出更短的内容,甚至是int
。
这样简单的东西就足够了,但如果你愿意的话可以缩短输出(注意不要在你的格式行中递归调用String()
):
func (s VWState) String() string {
return fmt.Sprintf("%#v", s)
}
func main() {
m := make(map[string]bool)
s := VWState{}
m[s.String()] = true
}
答案 1 :(得分:1)
如果dirtLocations
有合理的最大长度,那么您可以使用数组而不是切片。数组是可清除的(假设元素是可清除的)。
type VWState struct {
botLocation VWCoords
dirtLocations [4]VWCoords
}
然后,您需要添加有效dirtLocations
数量的计数或检测VWCoords
的零值,以计算出dirtLocations
中的有效插槽数。< / p>