包含切片的结构集

我正在尝试实现一个玩具搜索算法,并且需要维护一组探索状态。状态是一个结构体:


type VWState struct {

    botLocation   VWCoords

    dirtLocations []VWCoords

}

我的第一个想法是可以使用 a 来实现一个简单的 Set map[VWState]bool,但我似乎无法找到使其工作的方法。如果我尝试使用 aVWState作为地图的键,我会收到以下恐慌:


Panic: runtime error: hash of unhashable type vw.VWState (PC=0x40EB0D)

有没有办法使这项工作?我可以为结构实现自定义散列函数,还是应该寻找其他一些方法来实现它?


任何帮助将不胜感激。


鸿蒙传说
浏览 186回答 2
2回答

梵蒂冈之花

您可以使用指向结构的指针作为映射键: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}

翻过高山走不出你

如果有一个合理的最大长度,dirtLocations那么您可以使用数组而不是切片。数组是可散列的(前提是元素是可散列的)。type VWState struct {    botLocation   VWCoords    dirtLocations [4]VWCoords}然后,您需要添加有效数量的计数dirtLocations或检测 的零值VWCoords以计算出有多少个插槽dirtLocations是有效的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go