我正在尝试实现一个玩具搜索算法,并且需要维护一组探索状态。状态是一个结构体:type VWState struct { botLocation VWCoords dirtLocations []VWCoords}我的第一个想法是可以使用 a 来实现一个简单的 Set map[VWState]bool,但我似乎无法找到使其工作的方法。如果我尝试使用 aVWState作为地图的键,我会收到以下恐慌:Panic: runtime error: hash of unhashable type vw.VWState (PC=0x40EB0D)有没有办法使这项工作?我可以为结构实现自定义散列函数,还是应该寻找其他一些方法来实现它?任何帮助将不胜感激。
2 回答
梵蒂冈之花
TA贡献1900条经验 获得超5个赞
您可以使用指向结构的指针作为映射键:
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
}
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
如果有一个合理的最大长度,dirtLocations那么您可以使用数组而不是切片。数组是可散列的(前提是元素是可散列的)。
type VWState struct {
botLocation VWCoords
dirtLocations [4]VWCoords
}
然后,您需要添加有效数量的计数dirtLocations或检测 的零值VWCoords以计算出有多少个插槽dirtLocations是有效的。
- 2 回答
- 0 关注
- 184 浏览
添加回答
举报
0/150
提交
取消