为了账号安全,请及时绑定邮箱和手机立即绑定

包含切片的结构集

包含切片的结构集

Go
鸿蒙传说 2021-08-23 17:00:11
我正在尝试实现一个玩具搜索算法,并且需要维护一组探索状态。状态是一个结构体: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

}


查看完整回答
反对 回复 2021-08-23
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

如果有一个合理的最大长度,dirtLocations那么您可以使用数组而不是切片。数组是可散列的(前提是元素是可散列的)。


type VWState struct {

    botLocation   VWCoords

    dirtLocations [4]VWCoords

}

然后,您需要添加有效数量的计数dirtLocations或检测 的零值VWCoords以计算出有多少个插槽dirtLocations是有效的。


查看完整回答
反对 回复 2021-08-23
  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信